天天看点

Spring注解归纳

一、配置注解

1. @Configuration 告诉Spring这是一个配置类,此注解等同于配置文件<bean></bean> (类上)

2. @ComponentScan value属性:指定要扫描的包 (类上)

excludeFilters = Filter[] ,指定扫描的时候按照什么规则排除哪些组件

FilterType.ANNOTATION 按照注解扫描

FilterType.ASSIGNABLE_TYPE 按照指定类型扫描

3. @Bean 注解在方法上,声明当前方法的返回值为一个bean,id默认是方法名。

二、声明 bean 的注解

@Component 组件,没有明确的角色

@Service 在业务逻辑层使用(service层)

@Repository 在数据访问层使用(dao层)

@Controller 在表现层使用,表示为SpringMVC的控制器

三、@Bean的属性支持

@Scope 设置Spring容器创建Bean实例的类型(方法上,和@Bean一起使用)

prototype:多实例的,ioc容器启动并不会去调用方法创建对象放在容器中,每次获取的时候才会调用方法创建对象。

singleton:单实例的,ioc容器启动会调用方法创建对象放到ioc容器中,以后每次获取就是直接从容器中拿 (map.get())。

request:同一次请求创建一个实例。

session:同一个session创建一个实例。

四、@Import 导入组件

@Import 快速给容器中导入一个组件

1. @Import(要导入的组件) 容器中就会自动注册这个组件,id默认是全类。

2. ImportSelector:返回需要导入的组件的全类名数组(实现该接口)

3. ImportBeanDefinitionRegistrar :手动注册bean到容器中(实现该接口)

五、bean 的生命周期

bean的声明周期分为:bean创建---初始化---销毁

1. 容器管理bean的生命周期

我们可以自定义初始化和销毁方法,容器在bean 进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法。

调用无参构造(对象创建):

        单实例:在容器启动的时候创建对象

        多实例:在每次获取的时候创建对象

初始化:

        对象创建完成,并属性赋值好,调用初始化方法。。。

销毁:

       单实例:容器关闭时候销毁

       多实例:容器不负责管理这个 bean,容器不会调用销毁方法。

2. 初始化和销毁方式

1)指定初始化和销毁方法

通过@Bean指定init-method和destory-method;

Spring注解归纳

2)通过让 Bean 实现 InitializingBean(定义初始化逻辑),DisposableBean(定义销毁逻辑)

3)可以使用JSR250:(使用在方法上)

@PostConstruct:在bean创建完成并且属性赋值完成,来执行初始化方法

@PreDestroy:在容器销毁bean之前通知我们进行清理工作

4)BeanPostProcessor 接口 bean的后置处理器,在bean创建之后初始化完成前后进行一些处理工作

postProcessBeforeInitialization:初始化之前进行后置处理工作

postProcessAfterInitialization:初始化之后工作

Spring注解归纳

3. BeanPostProcessor原理 bean的后置处理器

源码:

首先调用 populateBean(beanName, mbd, instanceWrapper);给bean进行属性赋值

然后调用 initializeBean 进行初始化 {

创建完bean之后初始化之前:applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);

执行自定义初始化:invokeInitMethods(beanName, wrappedBean, mbd);

创建完bean之后初始化之后:applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);

}

Spring底层对 BeanPostProcessor的使用:

   bean赋值,注入其他组件,@Autowired,生命周期注解功能,@Async,xxx BeanPostProcessor 等都用到了BeanPostProcessor 。

六、组件赋值

1. @Value 为属性注入值

基本数值:@Value("科比")

SpEL表达式:@Value("#{20-2}")

取出配置文件的值:@Value("${person.nickName}") person.nickName为 properties文件中的属性。

2. 自动装配

Spring利用依赖注入(DI),完成对IOC容器中中各个组件的依赖关系赋值。

1)@Autowired:自动注入:

      1)、默认优先按照类型去容器中找对应的组件:applicationContext.getBean(BookDao.class);找到就赋值

      2)、如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找

      3)、@Qualifier("bookDao"):使用@Qualifier指定需要装配的组件的id,而不是使用属性名

      4)、自动装配默认一定要将属性赋值好,没有就会报错。

         required属性决定依赖注入是否必选,缺省true,意味着没有合适类型bean注入时,会抛出异常。

      5)、@Primary:让Spring进行自动装配的时候,默认使用首选的bean; 也可以继续使用@Qualifier指定需要装配的bean的名字。标注了@Primary的 bean 优先注入。

2)Spring还支持使用@Resource(JSR250)和@Inject(JSR330)[java规范的注解]

    @Resource:

          可以和@Autowired一样实现自动装配功能;默认是按照组件名称进行装配的。

          没有能支持@Primary功能没有支持@Autowired(reqiured=false)。

    @Inject:

         需要导入javax.inject的包,和Autowired的功能一样。没有required=false的功能。

AutowiredAnnotationBeanPostProcessor:解析完成自动装配功能;

 3)、 @Autowired:构造器,参数,方法,属性;都是从容器中获取参数组件的值

      1)、[标注在方法位置]:@Bean+方法参数;参数从容器中获取;默认不写@Autowired效果是一样的;都能自动装配

      2)、[标在构造器上]:如果组件只有一个有参构造器,这个有参构造器的@Autowired可以省略,参数位置的组件还是可以自动从容器中获取。

3. @PropertySource 读取外部配置文件

Spring注解归纳

4. @Profile 根据环境,动态激活、切换组件

@Profile:通过设定Environment的ActiveProfiles来设定当前context需要使用的配置环境。(类或方法上)

@Profile:指定组件在哪个环境的情况下才能被注册到容器中,不指定,任何环境下都能注册这个组件

1)、加了环境标识的bean,只有这个环境被激活的时候才能注册到容器中。默认是default环境。

2)、写在配置类上,只有是指定的环境的时候,整个配置类里面的所有配置才能开始生效。

3)、没有标注环境标识的bean,任何环境下都是加载的。

继续阅读