一、实例化Bean的方式
1、通过构造函数实例化:通过这种方法,配置文件写法如下
1 <bean id="exampleBean" class="com.mazhuo.ExampleBean"> 2 </bean>
2、使用静态工厂方法实例化:
当使用此方法时,除了要设置class的值,还需要设置factory-method属性来指定创建Bean实例的方法。配置文件写法如下:
1 <bean id="exampleBean" class="com.mazhuo.ExampleBean" factory-methord="creatBean"> 2 </bean>
对应的类应用如下方式定义:
1 public class ExampleBean{ 2 private static ExampleBean exampleBean = new ExampleBean(); 3 private ExampleBean(){} 4 public static ExampleBean creatBean(){ 5 return exampleBean; 6 } 7 }
3、使用工厂实例方法实例化:
此方法与第2个方法类似,使用这种方法时,class属性设置为空,而factory-method属性的值必须指定当前(或其祖先)容器中包含工厂方法的bean名称,而该工厂bean的工厂方法本身必须通过factory-method属性来指定。其中,一个工厂类中可以有多个工厂方法。配置文件写法如下:
1 <!-- 工厂Bean,包含creatBean()方法 --> 2 <bean id="serviceLocator" class="com.mazhuo.ServiceLocator"> 3 <!-- 其他依赖项的注入 --> 4 </bean> 5 6 <!-- 通过工厂Bean创建Bean --> 7 <bean id="clientService" factory-bean="serviceLocator" factory-methord="creatBean"> 8 </bean>
以上配置文件中的类的定义:
1 public class ServiceLocator { 2 private static ClientService clientService = new ClientService(); 3 private ServiceLocator(){} 4 public ClientService creatBean() { 5 return clientService; 6 } 7 }
二、Bean注入方式
1、基于构造函数:
通过调用具有多个参数的构造函数的容器来完成的,每个参数标识依赖关系,这与调用静态工厂方法来构造bean几乎是等效的。
1 public class SimpleMovieLister { 2 //SimpleMovieLister依赖于MovieFinder 3 private MovieFinder movieFinder; 4 //Spring容器可以通过构造函数注入MovieFinder 5 public SimpleMovieLister(MovieFinder movieFinder) { 6 this.movieFinder = movieFinder; 7 } 8 }
在上述代码中,配置文件中需要使用<constructor-arg>元素来指定构造函数参数或者索引类型。
开发者也可以通过参数的名称来去除二义性,但需要注意的是,用这种方法工作的代码必须启用调试标记编译,开发者也可以使用@ConstructorProperties标注来显示声明构造函数的名称。参考代码如下
1 public class ExampleBean { 2 private int year; 3 private String name; 4 @ConstructorProperties({"year","name"}) 5 public ExampleBean(int year, String name){ 6 this.name = name; 7 this.year = year; 8 } 9 }
2、基于setter方法:
通过调用无参数构造函数或无参数静态工厂方法来实例化bean后,通过调用setter方法完成的。
三、自动装配
1、@configuration:
用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义。
注意:@Configuration注解的配置类有如下要求:@Configuration不可以是final类型;@Configuration不可以是匿名类;嵌套的configuration必须是静态类。
2、@Bean注解注册bean,同时可以指定初始化和销毁方法
@Bean(name="testBean",initMethod="start",destroyMethod="cleanUp")
3、spring中bean的scope属性,有如下5种类型:
singleton表示在spring容器中的单例,通过spring容器获得该bean时总是返回唯一的实例。
prototype表示每次获得bean都会生成一个新的对象。
request表示在一次http请求内有效(只适用于web应用)。
session表示在一个用户会话内有效(只适用于web应用)。
globalSession表示在全局会话内有效(只适用于web应用)。
4、@Configuation等价于<Beans></Beans>
@Bean等价于<Bean></Bean>
@ComponentScan等价于<context:component-scan base-package="com.dxz.demo"/>
原文地址:https://www.cnblogs.com/ma-zhuo/p/11065753.html