组件扫描:
指定一个包路径,Spring会自动扫描该包及其子包所有组件类,当发现组件类定义前有特定的注解标记时,就将该组件纳入到Spring容器。等价与原有XML配置中的<bean>定义功能。
组件扫描可以替代大量XML配置的<bean>定义
1.指定扫描类路径
使用组件扫描,首先需要在XML配置中指定扫描类路径
<context:component-scan base-package="org.example">
上面配置,容器实例化时会自动扫描org.example包及其子包下所有组件类
2.自动扫描的注解标记
指定扫描类路径后,并不是该路径下所有组件类都扫描到Spring容器,只有在组件类定义前面有以下注解标记时,才会扫描奥Spring容器
注解标记描述
@Component 通用注解
@Name 通用注解
@Repository 持久化层组件注解
@Sercive 业务层组件注解
@Controller 控制层组件注解
3.自动扫描组件的命名
当一个组件在扫描过程中被检测到时,会生成一个默认id值,默认id值为小写字母开头的类名。也可以在注解标记中自定义id,下面两个组件id名字分别是oracleUserDao和loginService
eg:
@Repository
public class OracleUserDao implement UserDao{
//...
}
@Service("loginService")
public class UserService{
//...
}
4.指定组件的作用域
通常收Spring管理的组件,默认的作用域是“singleton”。如果需要其他的作用域可以使用@Scope注解,只要在注解中提供作用域的名称即可
eg: @Scope("prototype")
@Repository
public class OracleUserDao implements EmpDao{
//...
}
5.初始化和销毁回调函数的控制
@PostConstruct和PreDestroy注解分别用于指定初始化和销毁回调方法。
eg: public class ExampleBean{
@PostConstruct
public void init(){
//初始化回调方法
}
}
@PreDestroy
public void destroy(){
//销毁回调方法
}
6.指定依赖注入关系
具有依赖关系的Bean对象,利用下面任意一种注解都可以实现
1> @Resource
用在字段定义或Setter方法定义前面,默认首先按名称匹配注入,然后按内型匹配
eg: public class UserService{
//@Resource
private UserDao userDao;
@Resource
public void setUserDao(UserDao dao){
this.userDao = dao;
}
}
当遇到多个匹配Bean是注入会发生错误,可显式指定名称,
例如 (@Resource(name=""empDao1))
2> @Autowired/@Qualifier
用在字段定义或setter方法定义前面,默认按类型匹配注入
public class UserService{
//@Autowired
private UserDao userDao;
@Autowired
public void setUserDao(UserDao dao){
this.userDao = dao;
}
}
当@Autowired遇到多个匹配Bean是注入会发生错误,可指定名称,
public class UserService{
//@Autowired
//@Qualifier("mysqlUserDao")
private UserDao userDao;
@Autowired
public void setUserDao(@Qualifier("mysqlUserDao")
UserDao dao){
this.userDao = dao;
}
}
3> @Inject/@Named
@Inject注解标记是Spring3.0开始添增的对JSR-330标准的支持,使用前需要导包(JSR-330.jar),使用方法与@Autowired相似
当@Inject遇到多个匹配Bean是注入会发生错误,可使用@Named指定名称限定,使用方法与@Autowired的@Qualifier类似。
6.注入Spring表达式值
@Value注解可以注入Spring表达式值,使用方法如下:
1>首先在XML配置中指定要注入的 properties文件
<util:properties id="jdbcProps"
location="classpath:db.properties"/>
2>然后在setter方法前使用@Value注解
public class JDBCDataSource{
@Value("#{jdbcProps.url}")
private String url;
@Value("#{jdbcProps.driver}")
public void setUrl(String driver){
… …
}
}