一、分析
二、实现依据
三、@Autowired 注解使用
applicationContext.xml
<context:component-scan base-package="com.achang"></context:component-scan>
BookDao
@Repository
public class BookDao {
public void saveBook() {
System.out.println("保存了一本书");
}
}
BookService
@Service
public class BookService {
@Autowired
private BookDao bookDao;
public void save(){
System.out.println("正在调用Dao保存图书。。。。");
bookDao.saveBook();
}
}
BookServlet
@Controller
public class BookServlet {
//自动装配:自动为这个属性赋值
@Autowired
private BookService bookService;
public void doGet(){
bookService.save();
}
}
测试:
public class IOCTest {
ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
@Test
public void test2(){
BookServlet bookServlet = (BookServlet) ioc.getBean("bookServlet");
bookServlet.doGet();
//正在调用Dao保存图书。。。。
//保存了一本书
}
使用 @Qualifier 可以指定要装配的组件的名字 id;
@Autowired 的自动装配就是一定装配上,可以设置 required 属性,默认为 true,设置为 false 后,如果在容器中找不到就不进行装配,且不会报错。
@Controller
public class BookServlet {
@Qualifier(value = "bookServiceExt")
@Autowired(required = false)
private BookService bookService;
public void doGet() {
bookService.save();
}
}
四、原理和区别
(1)先按照类型去找,如果找到了,装配成功;
(2)如果资源类型的bean不止一个,默认根据@Autowired注解标记的成员变量名作为id查找bean,进行装配;
(3)如果根据成员变量名作为id还是找不到bean,可以使用@Qualifier注解明确指定目标bean的id;
(4)@Autowired注解的required属性指定某个属性允许不被设置;
@Autowired 原理【***】
<!--@Autowired原理
@Autowired
private BookService bookService;
1、先按照类型去容器找到对应的组件; bookService = ioc.getBean("BookService.class");
①匹配成功;装配
②匹配失败;抛出异常报错(NoSushBeanDefinitionException)
③匹配多个;
按照变量名作为id继续匹配
1)匹配成功;装配
2)匹配失败;抛出异常报错
失败原因:Spring会使用id在容器中匹配
【可使用@Qualifier("xxxXxx")指定一个新id匹配】
1)匹配成功;装配
2)匹配失败;抛出异常报错
发现AutoWired标注的自动装配的属性默认是一定装配上,任何情况下没匹配就是抛出异常报错
找到就装配,找不到就拉倒
@Autowired(required=false):默认为true,给为匹配上的赋值为null
先按照类型找,找到装配,找不到就按变量名做id找,找到装配,找不到抛异常。
可以用@Qualifier指定id去匹配;此注解可修饰参数
五、在形参位置使用 @Qualifier 注解
观看源码,可以看到 Autowired 注解可以使用在构造器,字段,方法和注解上面。
Qualifier 注解可以使用在字段,方法,参数,类和注解上面。
案例:
/**
* 方法上有 @Autowired 注解
* 1. 这个方法也会在 bean 创建的时候自动运行
* 2. 这个方法的每一个参数都会自动注入值
* 3. 可以使用Qualifier注解给参数添加注解
* 4. 使用 required 属性表示是否必须要装配
* @param bookDao
*/
@Autowired(required = false)
public void saveBook(BookDao bookDao, @Qualifier("bookService") BookService bookService) {
System.out.println("Spring运行了这个方法" + bookDao + "===" + bookService);
}
五、@Autowired 注解
六、@Autowired和@Resource、@Inject的区别
@Autowired、@Resource、@Inject都可以作为注入注解
1 2 3 4 5 6 7 8 | @Autowired :最强大;Spring的注解 ①扩展性差,依赖Spring容器框架 @Resource :j2ee;java的标准【jdk标准】 ①扩展性强:切换成另一个容器框架,其还会可以使用 【 @Inject :在EJB环境下使用()】 |
@Resource 注解要求提供一个 bean 名称的属性,若该属性为空,则自动采用标注处的变量或方法名作为 bean 的名称
@Inject 和 @Autowired 注解一样也是按类型注入匹配的 bean,但没有 required 属性。
七、代码示例
表示控制器层:
//@Controller(value="userCtrl") //使用 value 属性来给自动生成的 bean 指定 id,默认是类名的首字母表小写
@Controller("userCtrl") // 如果只设置 value 属性,value可以省略;但如果有多个属性,各个属性间用逗号分隔
public class UserController {
@Autowired(required=true) //自动装配,required 该属性表示是否必须自动装配成功
private IUserService userService; // true 表示 IOC 容器中必须有一个 bean 与该属性相匹配,然后完成自动装配,不然 Spring 报错
// false 表示 IOC 容器中可以没有与该属性匹配的 bean,即不必自动装配成功,Spring 也不会报错
public void addUser() {
userService.addUser();
}
public UserController() {
super();
System.out.println("UserController构造器");
}
}
业务逻辑层:
@Service
public class UserServiceImpl implements IUserService {
@Autowired
private IUserDao userDao;
/*
@Autowired // 这两个注解必须同时使用
@Qualifier(value="userDaoMybatisImpl") // 当有多个同类型的bean时,使用该注解指定 bean 的id来给形参赋值,与方法名无关
public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
}
*/
@Override
public void addUser() {
userDao.addUser();
}
public UserServiceImpl() {
super();
System.out.println("UserServiceImpl构造器");
}
}
持久层:
类一:
@Repository
public class UserDaoImpl implements IUserDao {
@Override
public void addUser() {
System.out.println("UserDaoImpl:添加成功");
}
public UserDaoImpl() {
super();
System.out.println("UserDaoImpl构造器");
}
}
类二:
@Repository
public class UserDaoMybatisImpl implements IUserDao {
@Override
public void addUser() {
System.out.println("添加成功");
}
public UserDaoMybatisImpl() {
super();
System.out.println("UserDaoMybatisImpl构造器");
}
}
八、注解配置 bean 总结
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· 面试官:你是如何进行SQL调优的?