Annotation-based Container Configuration
使用annotation配置更加简洁,Spring都支持这两种配置风格
spring2.0引用了@Required
spring2.5采用通用的方法来驱动spring依赖注入@Autowired
2.5还添加了JSR-250注释的支持,@PostConstruct和@PreDestroy
(初始化方法)(销毁方法)
需要注册单独的Bean定义,和context命名空间
<?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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
">
<context:annotation-config/>
</beans>
主要是添加这三句话
@Autowired
-
可以放在构造函数上
-
public class MovieRecommender { private final CustomerPreferenceDao customerPreferenceDao; @Autowired public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) { this.customerPreferenceDao = customerPreferenceDao; } // ... }
-
如果目标bean仅定义在一个开头的构造函数,则不需要在这样的构造函数上使用@Autowired,但是如果有几个构造器可用,则必须注释至少一个构造器,告诉容器使用哪一个
-
还可以放在setter方法上
-
public class SimpleMovieLister { private MovieFinder movieFinder; @Autowired public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } // ... }
-
可以放在方法上
-
public class MovieRecommender { private MovieCatalog movieCatalog; private CustomerPreferenceDao customerPreferenceDao; @Autowired public void (MovieCatalog movieCatalog, CustomerPreferenceDao customerPreferenceDao) { this.movieCatalog = movieCatalog; this.customerPreferenceDao = customerPreferenceDao; } // ... }
-
可以应用于字段,甚至可以与构造函数混合使用
-
public class MovieRecommender { private final CustomerPreferenceDao customerPreferenceDao; @Autowired private MovieCatalog movieCatalog; @Autowired public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) { this.customerPreferenceDao = customerPreferenceDao; } // ... }
-
这里使用的@Autowired注解的(member,set,constructor,method)都需要在xml中注入声明,否则在运行时找不到相匹配的(match)
-
<context:annotation-config/> <bean id="cat" class="com.haoyun.POJO.Cat"/> <bean id="dog" class="com.haoyun.POJO.Dog"/> <bean id="People" class="com.haoyun.POJO.People" p:name="asdfadf"/>
-
需要注入声明
-
还可以对array类型的字段和方法使用@Autowired
-
public class MovieRecommender { @Autowired private MovieCatalog[] movieCatalogs; // ... }
-
set集合
-
public class MovieRecommender { private Set<MovieCatalog> movieCatalogs; @Autowired public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) { this.movieCatalogs = movieCatalogs; } // ... }
-
Map
-
public class MovieRecommender { private Map<String, MovieCatalog> movieCatalogs; @Autowired public void setMovieCatalogs(Map<String, MovieCatalog> movieCatalogs) { this.movieCatalogs = movieCatalogs; } // ... }
-
required=false,这个对象可以为nul
-
public class SimpleMovieLister { private MovieFinder movieFinder; @Autowired(required = false) public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } // ... }
-
这个构造函数不传参也可以
-
使用@Nullable也可以表示可以为null
-
public class SimpleMovieLister { @Autowired public void setMovieFinder(@Nullable MovieFinder movieFinder) { ... } }
-
使用限定自动装配
-
@Qualifier("")
-
public class MovieRecommender { @Autowired @Qualifier("main") private MovieCatalog movieCatalog; // ... }
-
算了太长
-
完全看不完
-
说下视频中讲解的主要内容吧
-
@Autowired如何实现
-
先以ByType方式实现
-
在context中寻找使用@Autowired注解使用的同类型的注解声明,
-
<bean class="com.haoyun.POJO.Cat"/> <bean class="com.haoyun.POJO.Dog"/> <bean id="People" class="com.haoyun.POJO.People" p:name="asdfadf"/>
-
没有bean-id都没关系,先是根据type寻找
-
<bean id="cat1" class="com.haoyun.POJO.Cat"/> <bean id="cat2" class="com.haoyun.POJO.Cat"/> <bean id="dog1" class="com.haoyun.POJO.Dog"/> <bean id="dog2" class="com.haoyun.POJO.Dog"/> <bean id="People" class="com.haoyun.POJO.People" p:name="asdfadf"/>
-
但是出现这种类型相同,就不知道怎么选了,就会报错,需要加入一个bean-id限定@Qualifier("")
-
就会引用到bean-id为dog1上的注入声明
-
-
@Resouce注解也有同样的用处,不过用的比较多的是@Autowired
-
Resouce是先查找byName的,不行再查找byType
-
Autowired先查找byType,再查找byName
-
@Resource注解中有很多可使用的参数
-
name和type的意思应该很明了
-
NoUnique不唯一
-
@Resource(type = Dog.class) @Resource(name = "cat1")
-
总结一下:
- @Autowired先以bytype方式查找,之后以byName方式查找
- 可以定义在很多处位置,但是直接定义在成员上最方便
- 可以配合@Qualifier注解进行限定
- 内置required参数可以允许参数为null和@Nullable功能一致
- 这个注解是spring的
- @Resource以byName方式查找,之后以byType方式查找
- 内置很多参数,使用方便
- 这个注解是java的,在spring还是多用spring的注解吧
- @Autowired先以bytype方式查找,之后以byName方式查找