您的位置:首页 > 编程语言 > Java开发

spring annotation

2016-04-16 14:02 701 查看
http://blog.csdn.net/kaiwii/article/details/7877663

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

Java代码







<!-- 该 BeanPostProcessor 将自动起作用,对标注 @Autowired 的 Bean 进行自动注入 -->

<beanclass="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

[java] view plain copy

<!-- 该 BeanPostProcessor 将自动起作用,对标注 @Autowired 的 Bean 进行自动注入 -->

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

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

Java代码







<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:annotation-config/>

</beans>

[java] view plain copy

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:annotation-config/>

</beans>

2、@Autowired默认按照类型匹配的方式进行注入
3、@Autowired注解可以用于成员变量、setter方法、构造器函数等
4、使用@Autowired注解须有且仅有一个与之匹配的Bean,当找不到匹配的 Bean 或者存在多个匹配的Bean时,Spring 容器将抛出 异常
5、Spring 允许我们通过 @Qualifier 注释指定注入 Bean 的名称。@Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了。

Java代码







public class MovieRecommender {

@Autowired

@Qualifier("mainCatalog")

private MovieCatalog movieCatalog;

private CustomerPreferenceDao customerPreferenceDao;

@Autowired

public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {

this.customerPreferenceDao = customerPreferenceDao;

}

// ...

}

[java] view plain copy

public class MovieRecommender {

@Autowired

@Qualifier("mainCatalog")

private MovieCatalog movieCatalog;

private CustomerPreferenceDao customerPreferenceDao;

@Autowired

public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {

this.customerPreferenceDao = customerPreferenceDao;

}

// ...

}

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

Java代码







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

[java] view plain copy

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

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

Java代码







public class SimpleMovieLister {

private MovieFinder movieFinder;

@Resource

public void setMovieFinder(MovieFinder movieFinder) {

this.movieFinder = movieFinder;

}

}

[java] view plain copy

public class SimpleMovieLister {

private MovieFinder movieFinder;

@Resource

public void setMovieFinder(MovieFinder movieFinder) {

this.movieFinder = movieFinder;

}

}

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

Java代码







public class CachingMovieLister {

@PostConstruct

public void populateMovieCache() {

// populates the movie cache upon initialization...

}

@PreDestroy

public void clearMovieCache() {

// clears the movie cache upon destruction...

}

}

[java] view plain copy

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 的名称。

Java代码







@Component

public class ActionMovieCatalog implements MovieCatalog {

// ...

}

[java] view plain copy

@Component

public class ActionMovieCatalog implements MovieCatalog {

// ...

}

3、<context:component-scan/> 允许定义过滤器将基包下的某些类纳入或排除。Spring 支持以下 4 种类型的过滤方式:

过滤器类型表达式范例
annotationorg.example.SomeAnnotation
assignableorg.example.SomeClass
regexorg\.example\.Default.*
aspectjorg.example..*Service+
下面这个XML配置会忽略所有的@Repository注解并用“stub”储存库代替。

Java代码







<beans ...>

<context:component-scan base-package="org.example">

<context:include-filter type="regex" expression=".*Stub.*Repository"/>

<context:exclude-filter type="annotation"expression="org.springframework.stereotype.Repository"/>

</context:component-scan>

</beans>

[java] view plain copy

<beans ...>

<context:component-scan base-package="org.example">

<context:include-filter type="regex" expression=".*Stub.*Repository"/>

<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>

</context:component-scan>

</beans>

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

Java代码







@Scope("prototype")

@Repository

public class MovieFinderImpl implements MovieFinder {

// ...

}

[java] view plain copy

@Scope("prototype")

@Repository

public class MovieFinderImpl implements MovieFinder {

// ...

}

5、Spring 2.5引入了更多典型化注解(stereotype annotations): @Component、@Service和 @Controller。 @Component是所有受Spring管理组件的通用形式; 而@Repository、@Service和 @Controller则是@Component的细化, 用来表示更具体的用例(例如,分别对应了持久化层、服务层和表现层)

Java代码







@Service

public class SimpleMovieLister {

private MovieFinder movieFinder;

@Autowired

public SimpleMovieLister(MovieFinder movieFinder) {

this.movieFinder = movieFinder;

}

}

@Repository

public class JpaMovieFinder implements MovieFinder {

// implementation elided for clarity

}

[java] view plain copy

@Service

public class SimpleMovieLister {

private MovieFinder movieFinder;

@Autowired

public SimpleMovieLister(MovieFinder movieFinder) {

this.movieFinder = movieFinder;

}

}

@Repository

public class JpaMovieFinder implements MovieFinder {

// implementation elided for clarity

}

6、要检测这些类并注册相应的bean,需要在XML中包含以下元素,其中'basePackage'是两个类的公共父包 (或者可以用逗号分隔的列表来分别指定包含各个类的包)。

Java代码







<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:component-scan base-package="org.example"/>

</beans>

[java] view plain copy

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:component-scan base-package="org.example"/>

</beans>

此外,在使用组件扫描元素时,AutowiredAnnotationBeanPostProcessor 和CommonAnnotationBeanPostProcessor会隐式地被包括进来。 也就是说,连个组件都会被自动检测并织入 - 所有这一切都不需要在XML中提供任何bean配置元数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: