Bean的参数配置

Spring利用xml文件进行配置

1. 作用域

作用域可以分为:singleton,prototype,request,session。

  • singleton的意思为同一Bean容器中仅保留一份实例。
  • prototype的意思为每次调用都生成新的实例对象,并且该对象会被垃圾回收。
  • request的意思为在同一request中仅生成一份实例。
  • session为在同一session中仅生成一份实例。

2. 生命周期

bean的生命周期可以分为定义,初始化,使用和销毁四个阶段。而定义一般在xml文件中配置完成。
bean的初始化操作可以采用两种方法进行,一种是在xml配置文件中设置“init-method”参数的值为对应bean中的初始化方法的名称;另一种是在不配置xml文件的情况下,让对应的bean实现InitializingBean接口,并且在bean中覆盖具体的afterPropertiesSet()方法。
bean的销毁操作同样可以用两种方法设置。一是配置“destroy-method”参数;二是实现DisposableBean借口,并覆盖destroy()方法。
需要注意的是,无论初始化还是销毁操作,实现接口的方法将会优先于xml配置参数的方法进行。

另一方面,还可以通过在配置默认的初始化和销毁方法default-init-methoddefault-destory-method进行设置,然后在具体Bean中实现对应方法即可。注意,默认初始化方法和销毁方法可以被前两种Bean的初始化、销毁方法覆盖,也可以不用实现。但是前两种Bean方法配置后就必须要实现,否则报错。

3. Aware相关接口

通过实现如ApplicationContextAwareBeanNameAware等Aware接口,就可以在启动时获取到相应的配置信息,并且可以进行相关的修改配置操作。

4. 自动装配Autowire

在Spring中,可以采用自动装配的方式进行Bean内部私有类的自动装配。具体的方式是对xml文件中的Beans信息进行配置。字段为default-autowire,值为byName,byType,constructor三种。
byName是通过bean的id进行匹配注入的,即对于私有类的set方法,其接受参数的名称要和xml文件内bean的名称相同,否则无法自动装配。
byType也是通过set方法进行自动装配,不过其是通过set方法接受参数的类型,去xml文件中进行寻找,因此即使xml文件中没有bean的id,也可以自动装配。
constructor是通过构造器方法进行自动装配的,其搜寻方式同byType一样,也是通过bean的类型进行寻找。

5. 资源文件Resource

在Spring中,可以通过调用applicationContext类的getResource方法去获得相应的资源文件。在getResource方法中,可以传入的参数类型有classpath,file,http等,其后接上具体地址构成字符串即可找到对应资源文件。


Spring利用注解形式进行配置

Spring也可以利用注解的形式来代替配置xml文件。

1. Bean的定义

对于原先使用xml配置bean的id,类的类型以及作用域的情况,现在可以采用的是注解的形式。@Component注解为基础注解,可以注解任意Bean类型。@Service@Repository@Controller注解和Component注解一样,不过更具针对性.这四个注解都是用于对Bean的定义,并且可以采用形如@Component("beanId")的形式进行重新配置bean的id.
作用域的注解为@Scope,默认采用的是singleton模式,也可以自己配置为prototype等模式.
值得注意的是,当使用注解的时候,需要在xml里面添加上扫描范围,如

2. 自动装配注解

如果Bean中的私有类有set方法,则可以在Set方法上使用@Required注解进行自动装配.不过,更常用的是使用@Autowired注解,该注解不仅可以注解在set方法上,也可以直接注解在私有变量或者构造器方法上.并且,通过采用配置@Autowired(required = false)的形式,可以使得找不到注入bean时可以不报错.
当被标记@Autowired的 私有类是一个接口,且有多个实现类时,可以同时添加@Qualifier("子类id")来限定装配哪个子类.
@Autowired还可以用来装配set和map,当集合其中的拓展类型是接口或者父类时,便会将其子类都装配进去.

除了@Autowired注解,也可以使用@Resource注解.@Resource的装配顺序:

  1. @Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配
  2. 指定了name或者type则根据指定的类型去匹配bean
  3. 指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错

然后,区分一下@Autowired和@Resource两个注解的区别:

  1. @Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配
  2. @Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了
    .----https://www.cnblogs.com/xiaoxi/p/5935009.html

3. @Configuration@Bean

@Bean可以用来注释在方法上,等价于在xml中配置Bean.

@Bean 标记在方法之上,方法的返回值为向springIOC容器之中注入一个Bean.
  其中,返回值相当于xml文件bean标签的class属性,方法的名称相当于id属性.
  我们的property属性被放置在了方法的实现之中.
@Bean注解有一个属性,name属性,可以帮助我们指定Bean的id的名字.

一般@Bean会和@Configuration一起搭配使用,@Configuration用在类之上,表明该类是一个配置类,作用等价于xml配置文件.

@ImportResource@Value是配合使用的,可以搭配@Configuration@Bean一起进行将类转化为配置类,并进行配置.其中,@ImportResource("classpath:/路径")用于设置键值对文件的路径,Value采用@Value(${key})的方式进行调用赋值.

类似的,在注解体系中,也有@PostConstruct@PreDestroy注解可以用于Bean的启动和注销方法上.

你可能感兴趣的:(Spring)