使用注解定义Bean
Spring从2.0开始基于注解的方式进行配置,在3.0时得到了进一步的完善。Srping容器成功启动的三大要件分别是:Bean定义的信息,Bean实现类已经Spring本身。如果采用XML方式来配置的话,Bean定义信息和Bean实现类本身是分离的,而采用注解的方式配置的话,Bean定义的信息即通过在Bean实现类上标注的注解实现。
@Component 放在一个类前边,他可以被Spring识别,Spring容器会自动将POJO转换为容器管理的Bean.他和XML配置是等效的:<bean id = "UserDao" class= "com.test....">
下面有几个和这个等效,但是有微小差别:
@Repository :用于Dao层实现类进行标注。
@Service: 用于Service层实现类进行标注。
@Controller: 用于对Controller实现类进行标注
使用注解配置信息启动Spring容器
Spring 2.5x以后,提供了一个Context的命名空间,它提供了通过扫描类包以应用注解的方式定义Bean
<?xml version="1.0" encoding="UTF-8"?>
<!-- 1.声明context的命名空间 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd"><!-- 2. 扫描类包以应用注解定义的Bean -->
<context:component-scan base-package="visoup,visoup.common,visoup.framework" />
</beans>
context命名空间的component-scan的base-package属性指定了一个要扫描的类包,spring容器会扫描这个类包所有的类,并且从类的注解中获取Bean的定义信息
如果仅仅希望扫描特定的类包,而非基类包的所有的类,那么使用resource-pattern="anno/*.class"这样则会扫描类包下的anno类包下的所有的类。
自动装配Bean
使用@Autowired进行自动注入
// 1、定义了一个Bean
@Component
public class LoadSystemData {
//2、注入baseDao
@Autowired
private BaseDAO baseDAO;
在1处将LoadSystemData 标注为一个Bean,在2处通过@Autowired注入到baseDao的Bean。@Autowired默认是按照类型匹配的方式,在容器查找匹配的Bean,当有且仅又一个匹配的时候,Spring将其注入到@Autowired的标注变量中。
使用@Autowired的required的属性
如果容器中没有标注一个和标注变量类型匹配的时候,Spring容器将会报NoSuchBeanDefinitionException的异常。如果希望Spring容器即使找不到匹配的Bean完成注入也不要抛出异常,那么可以使用@Autowired(required=false)进行标注。
有的时候按类型注入得时候,Spring容器里边可能有多个对象,那么使用下边的方法
使用@Qualifier指定注入Bean的名称
@Qualifier("userDao"),这时,假设容器有两个类型为UserDao的Bean,一个名字为userDao,另一个名为otherUserDao,那么则会注入名字为userDao的Bean
@Resource @Inject @Autowired区别
@Resource 是按照名称进行注入的 使用@Autowired@Qualifier("userDao")即可完成这一操作
@Inject 是按照类型进行注入的 但是没有(required=false)这个属性
@Autowired开发中还是很常用的
基于xml、基于注解、基于java类 的方式的使用
- Bean的实现类来源于三方类库、比如DataSource、JdbcTemplate等,无法在类中进行标注注入,通过xml方式比较好;
- 命名空间的配置,如aop、context,只能采用xml进行配置
- Bean的实现类是基于当前项目开发的,使用注解方式比较好
- 基于java类配置的,一般用于实例化 Bean类比较复杂的,控制Bean初始化的整体逻辑