annotation(spring注解)

本文深入探讨了Spring IoC容器中常用的注解,包括@Autowired、@Resource、@PostConstruct、@PreDestroy等,解释了它们的工作原理、区别及使用场景。重点介绍了JSR-330规范与Spring注解之间的差异,以及如何通过XML配置和注解配置实现组件的自动装配和生命周期管理。
摘要由CSDN通过智能技术生成

2.0
@Required
设置在set方法上如果该属性的参数没设置就会报

异常:
org.springframework.beans.factory.BeanInitializationException

2.5
@PostConstruct和@PreDestroy


3.0
JSR-330(javaee6:javax.inject),如注解@Inject和@Named。

@Component,@Repository@Service是一样的,都是在声明Spring IoC容器中的bean。
@Autowired@Component
@Inject@Named基本上,它的工作原理和上面相同,只是用不同的注解
JSR-330spring的区别:
1.@Inject没有required的属性,以确保bean被注入成功
2.spring容器中,JSR默认的范围是单例,提供了@Scope注解。不过,这其中仅用于用于创建自己的注解,不像spring中可以用@Scope来定义范围,
3.没有相当于spring中的@Value,@Required或者@Lazy
Spring的注解更强大,但仅适用于Spring框架。
该JSR-330是一个标准的规范,并且它支持所有的JavaEE环境遵循JSR-330规范的。
对于新的或迁移的项目,它总是建议使用JSR-330的注解,它适用于spring3最好。
xml中的定义会覆盖类中注解的Bean(spring工厂管理的类)定义
注释需要组件扫描工作
<context:component-scan base-package="" />
该标签表示隐式注册后处理器包括AutowiredAnnotationBeanPostProcessor, CommonAnnotationBeanPostProcessor, PersistenceAnnotationBeanPostProcessor,
RequiredAnnotationBeanPostProcessor

或者使用隐式注册(隐式注册 post-processors 包括了 AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor。) 

<context:annotation-config/>
<context:annotation-config/>   
如果你在web.xml中配置了DispatcherServle,在控制器它只检查@Autowired而不会检查其他,反之它会扫描类中的后置处理器

@Autowired

@Autowired默认按类型自动注入属性,如果要按名字可在方法参数上加@Qualifier("")或者在方法上加@Qualifier(""),如果属性没设置有不想报错加上@Autowired(required=false)

@Autowired
1、Spring 通过一个 BeanPostProcessor 对 @Autowired 进行解析,所以要让 @Autowired 起作用必须事先在 Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean。

<!-- 该 BeanPostProcessor 将自动起作用,对标注 @Autowired 的 Bean 进行自动注入 -->  
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>       
</beans>

@Resource
1、@Resource 的作用相当于 @Autowired,只不过 @Autowired 按 byType 自动注入,@Resource 默认按 byName 自动注入罢了。
2、要让注释生效,除了在 Bean 类中标注这些注释外,还需要在 Spring 容器中注册一个负责处理这些注释的 BeanPostProcessor

<bean  class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/> 

3、@Resource 有两个属性是比较重要的,分别是 name 和 type,Spring 将 @Resource 注释的 name 属性解析为 Bean 的名字,而 type 属性则解析为 Bean 的类型。所以如果使用 name 属性,则使用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入策略。如果既不指定 name 也不指定 type 属性,这时将通过反射机制使用 byName 自动注入策略。


@PostConstruct 和 @PreDestroy
标注了 @PostConstruct 注释的方法将在类实例化后调用,而标注了 @PreDestroy 的方法将在类销毁之前调用。

public class CachingMovieLister {  

    @PostConstruct  
    public void populateMovieCache() {  
        // populates the movie cache upon initialization...  
    }  

    @PreDestroy  
    public void clearMovieCache() {  
        // clears the movie cache upon destruction...  
    }  
}   

@Component
1、使用@Component注解可以直接定义Bean,而无需在xml定义。但是若两种定义同时存在,xml中的定义会覆盖类中注解的Bean定义。
2、@Component 有一个可选的入参,用于指定 Bean 的名称。

@Component  
public class ActionMovieCatalog implements MovieCatalog {  
    // ...  
}   

4、默认情况下通过 @Component 定义的 Bean 都是 singleton 的,如果需要使用其它作用范围的 Bean,可以通过 @Scope 注释来达到目标

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值