Spring核心之6 SpringIOC容器基于注解的组件扫描
2018-10-14 15:47
627 查看
1.什么是组件扫描
指定一个包路径,Spring会自动扫描该包及其子包所有组件类,当发现组件类定义前有特定的注解标记时,就将该组件纳入到spring容器,等价于原有的xml配置中的bean定义功能; 组件扫描可以替代xml配种的bean定义
2.指定扫描类路径
使用组件扫描,首先需要在xml配置中指定扫描类路径
xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"
<context:component-scan base-package="com.gaoxinfu.demo.spring"></context:component-scan>
3.自动扫描的注解标记
指定扫描类路径后,并不是该路径下所有的组件类都扫描到Spring容器的,只有在组件类定义前面有以下注解标记时,才会扫描到Spring容器;
3.1 @Component 通用注解
3.2 @Name 通用注解
3.3 @Repository 持久化层组件注解
3.4 @Service 业务层组件注解
3.5 @Controller 控制层组件注解
4.自动扫描组件的命名
当一个组件在扫描过程中被检测到时,会生成一个默认id值,默认id为小写开头的类名,也可以在注解标记中自定义id,下面两个组件id名字分别是oracleUserDao和loginService
5.指定扫描的作用域
通常受Spring管理的组件,默认的作用域是singleton,如果需要其他的作用域可以适用@Scope注解,只要在注解中国提供作用域的名称即可; @Scope("prototype") @Scope("singleton")
6.初始化和销毁回调的控制
@PostConstruct public void init() { logger.info("ExampleBean2方法init()初始化ExampleBean2对象"); }
@PreDestroy public void destroy() { logger.info("ExampleBean2方法destroy()销毁ExampleBean2对象"); }
7.指定依赖注入关系
具有依赖关系的Bean对象,利用下面的任意一种注解都可以实现关系注入 @Resource @Autowired/@Qualified @Inject/@Named
7.1 @Resource
@Resource注解标记可以用在字段定义或setter方法定义前面,默认首先按名称匹配注入,然后类型匹配注入; 当遇到多个匹配Bean时注入会发生错误,可以显示指定名称例如 @Resource(name="empDao1")
package com.gaoxinfu.demo.spring.example.service; import javax.annotation.Resource; import com.gaoxinfu.demo.spring.example.bean.User; import com.gaoxinfu.demo.spring.example.dao.UserDAO; /** * * @Description:TODO * @Author:gaoxinfu * @Time:2018年2月17日 下午5:56:10 */ public class UserService { // @Resource private UserDAO userDAO; public UserDAO getUserDAO() { return userDAO; } @Resource public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } /** * * @Title: login * @Description: 用户登录功能 * @param name * @param pwd * @return * @return: User * @throws * @Exception: * @Author: gaoxinfu * @Time:2018年2月12日 下午4:50:22 */ public User login(String name,String pwd) { User user=userDAO.findByName(name); if (user!=null&&pwd.equals(user.getPwd())) { return user; } return null; } }
7.2 @Autowired
@Autowired注解标记也可以用在字段或setter方法定义前面,默认按类型呢匹配注入 当@Autowired遇到多个匹配Bean时注入会发生错误,可以使用下面方法指定名称@Qualified("mysqlUserDao")
package com.gaoxinfu.demo.spring.example.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import com.gaoxinfu.demo.spring.example.bean.User; import com.gaoxinfu.demo.spring.example.dao.UserDAO; /** * * @Description:TODO * @Author:gaoxinfu * @Time:2018年2月17日 下午5:56:10 */ public class UserService { // @Autowired // @Qualifier("mysqlUserDao") private UserDAO userDAO; public UserDAO getUserDAO() { return userDAO; } @Autowired public void setUserDAO(@Qualifier("mysqlUserDao")UserDAO userDAO) { this.userDAO = userDAO; } /** * * @Title: login * @Description: 用户登录功能 * @param name * @param pwd * @return * @return: User * @throws * @Exception: * @Author: gaoxinfu * @Time:2018年2月12日 下午4:50:22 */ public User login(String name,String pwd) { User user=userDAO.findByName(name); if (user!=null&&pwd.equals(user.getPwd())) { return user; } return null; } }
7.3 @Inject
需要引入javax.inject包
<!-- https://mvnrepository.com/artifact/javax.inject/javax.inject --> <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency>
@Inject注解标记时Spring3.0开始增加的对JSR-3.0标准的支持,使用前需要添加JSR-3.0的jar包,使用方法与Autowired相似,具体如下
package com.gaoxinfu.demo.spring.example.service; import javax.inject.Inject; import com.gaoxinfu.demo.spring.example.bean.User; import com.gaoxinfu.demo.spring.example.dao.UserDAO; /** * * @Description:TODO * @Author:gaoxinfu * @Time:2018年2月17日 下午5:56:10 */ public class UserService { @Inject private UserDAO userDAO; public UserDAO getUserDAO() { return userDAO; } public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } /** * * @Title: login * @Description: 用户登录功能 * @param name * @param pwd * @return * @return: User * @throws * @Exception: * @Author: gaoxinfu * @Time:2018年2月12日 下午4:50:22 */ public User login(String name,String pwd) { User user=userDAO.findByName(name); if (user!=null&&pwd.equals(user.getPwd())) { return user; } return null; } }
当@Inject遇到多个匹配Bean时注入会发生错误,可以使用@Named指定名称限定,使用方法如下:
package com.gaoxinfu.demo.spring.example.service; import javax.inject.Inject; import javax.inject.Named; import com.gaoxinfu.demo.spring.example.bean.User; import com.gaoxinfu.demo.spring.example.dao.UserDAO; /** * * @Description:TODO * @Author:gaoxinfu * @Time:2018年2月17日 下午5:56:10 */ public class UserService { @Inject private UserDAO userDAO; public UserDAO getUserDAO() { return userDAO; } public void setUserDAO(@Named("mysqlUserDao")UserDAO userDAO) { this.userDAO = userDAO; } /** * * @Title: login * @Description: 用户登录功能 * @param name * @param pwd * @return * @return: User * @throws * @Exception: * @Author: gaoxinfu * @Time:2018年2月12日 下午4:50:22 */ public User login(String name,String pwd) { User user=userDAO.findByName(name); if (user!=null&&pwd.equals(user.getPwd())) { return user; } return null; } }
8.注入Spring表达式
@Value注解可以注入Spring表达式值,使用方法:
首先在xml配置中指定要注入的properties文件
<util:properties id="jdbcProperties" location="classpath:db.properties" />
db.properties
drive=oracle.jdbc.driver.OracleDriver url=jdbc:oracle:thin:@localhost:1521:xe name=system password=system
然后在setter方法前使用@Value注解
@Value("#{jdbcProperties.driver}") private String driver;阅读更多
相关文章推荐
- Spring核心三(基于注解的组件扫描)
- Spring学习3--基于注解的组件扫描
- Spring - 基于注解的组件扫描
- Spring核心框架IOC---- 使用注解完成IOC配置---- 使用注解配置spring组件
- Spring(四)基于注解配置IOC容器&基于注解实现声明式事务
- SpringIOC_容器的类扫描注解
- Spring--IoC--基于注解的DI-组件扫描器的base-package
- 初学SpringMVC+Mybatis之Spring基于注解的组件扫描
- Spring IOC之基于注解的容器配置
- Spring(四)基于注解配置IOC容器&基于注解实现声明式事务
- 四、初学SpringMVC+Mybatis之Spring基于注解的组件扫描
- Spring学习3—控制反转(IOC)基于Annotation(注解)的依赖注入实现
- 码农小汪-spring框架学习之6-spring基于注解的容器配置 @Qualifier @Autowired @Resouce @PostConstruct @PreDestroy
- 移植 Laravel 核心组件:如何给 TP3.1 用上 IoC 容器 (一)
- spring IOC核心源码:容器创建过程
- Spring 基于注解的IOC配置&整合Junit
- Spring中我们用到的功能实现:基于注解的Ioc自动装配
- 【Spring 系列 给IOC容器添加组件的几种方式总结】
- Spring之核心容器IoC
- Spring容器拆分、自动装配和依赖检查机制,基于注解的sessionFactory