Bean 的依赖注入分析

📅 2026/7/22 6:36:54
Bean 的依赖注入分析
package com.ycl.dao; public interface UserDao { public void save(); } package com.ycl.dao.impl; import com.ycl.dao.UserDao; public class UserDaoImpl implements UserDao { public UserDaoImpl(){ System.out.println(UserDaoImpl创建...); } public void init(){ System.out.println(初始化方法...); } public void destroy(){ System.out.println(销毁方法...); } public void save(){ System.out.println(save running...); } } package com.ycl.service; public interface UserService { public void save(); } package com.ycl.service.impl; import com.ycl.dao.UserDao; import com.ycl.service.UserService; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class UserServiceImpl implements UserService { public void save(){ ApplicationContext app new ClassPathXmlApplicationContext(applicationContext.xml); UserDao userDao (UserDao) app.getBean(userDao); userDao.save(); } } package com.ycl.demo; import com.ycl.service.UserService; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class UserController { public static void main(String[] args) { ApplicationContext app new ClassPathXmlApplicationContext(applicationContext.xml); UserService userService (UserService) app.getBean(userService); userService.save(); } } ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd bean iduserDao classcom.ycl.dao.impl.UserDaoImpl/bean bean iduserService classcom.ycl.service.impl.UserServiceImpl/bean /beans目前UserService 实例和 UserDao 实例都存在于 Spring容器中当前的做法是在容器外部获得 UserService实例和 UserDao实例然后在程序中进行结合。getBean(name:userService)获得 UserService实例发现 UserService 实例内部需要 UserDao实例的save()方法所以在UserService内部获得UserDao实例。getBean(name:userDao);相当于是在Spring容器外将Dao组装到Service内部完成的操作。DAO:Data Access Object;因为 UserService 和 UserDao都在Spring容器中而最终程序直接使用的是UserService,所以可以在Spring容器中将UserDao设置到 UserService内部。UserDao实例--UserService实例--getBean(name:userService);#Bean的依赖注入概念;依赖注入(Dependency Injection):它是Spring框架核心IOC的具体实现。在编写程序时通过控制反转把对象的创建交给了 Spring,但是代码中不可能出现没有依赖的情况。IOC解耦只是降低他们的依赖关系单不会消除。例如业务层仍会调用持久层的方法。那这种业务层和持久层的依赖关系在使用Spring之后就让Spring来维护了。简单来说就是坐等框架把持久层对象传入业务层而不用我们自己去获取。#Bean的依赖注入方式怎么将UserDao怎样注入到 UserService内部呢?构造方法;set方法。#set方法注入; ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd bean iduserDao classcom.ycl.dao.impl.UserDaoImpl/bean bean iduserService classcom.ycl.service.impl.UserServiceImpl property nameuserDao refuserDao/property /bean /beans property nameuserDao: 这个名称来自 setUserDao set后面的UserDao第一个字母小写; refuserDao 指代上面iduserDao package com.ycl.service.impl; import com.ycl.dao.UserDao; import com.ycl.service.UserService; public class UserServiceImpl implements UserService { private UserDao userDao; public void setUserDao(UserDao userDao){ this.userDao userDao; } public void save(){ userDao.save(); } } package com.ycl.demo; import com.ycl.service.UserService; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class UserController { public static void main(String[] args) { ApplicationContext app new ClassPathXmlApplicationContext(applicationContext.xml); UserService userService (UserService) app.getBean(userService); userService.save(); } } set方法注入; P 命名空间注入本质也是 set方法注入但比起上述的set方法注入更加方便主要体现在配置文件中 如下:首先,需要引入 P 命名空间: xmlns:phttp://www.springframework.org/schema/p 其次,需要修改注入方式: bean iduserService classcom.ycl.service.impl.UserServiceImpl p:userDao-refuserDao/ ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:phttp://www.springframework.org/schema/p xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd bean iduserDao classcom.ycl.dao.impl.UserDaoImpl/bean bean iduserService classcom.ycl.service.impl.UserServiceImpl p:userDao-refuserDao/ /beans P命名空间现在已经很少见了了解即可。 #有参构造方法。 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:phttp://www.springframework.org/schema/p xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd bean iduserDao classcom.ycl.dao.impl.UserDaoImpl/bean bean iduserService classcom.ycl.service.impl.UserServiceImpl constructor-arg nameuserDao refuserDao/constructor-arg /bean /beans constructor-arg nameuserDao:这个是构造方法内部的参数名; refuserDao 表示容器中beanid; package com.ycl.service.impl; import com.ycl.dao.UserDao; import com.ycl.service.UserService; public class UserServiceImpl implements UserService { private UserDao userDao; public UserServiceImpl(UserDao userDao) { this.userDao userDao; } public UserServiceImpl() { } public void save(){ userDao.save(); } } #Bean的依赖注入的数据类型 上面的操作都是注入的引用Bean,除了对象的引用可以注入普通数据类型集合等都可以在容器中进行注入。 注入数据的三种数据类型: 普通数据类型 引用数据类型 集合数据类型 #普通数据类型注入: package com.ycl.dao.impl; import com.ycl.dao.UserDao; public class UserDaoImpl implements UserDao { private String username; private int age; public void setUsername(String username) { this.username username; } public void setAge(int age) { this.age age; } public void save(){ System.out.println(usernameage); System.out.println(save running...); } } ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:phttp://www.springframework.org/schema/p xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd bean iduserDao classcom.ycl.dao.impl.UserDaoImpl property nameusername valuezhangsan/ property nameage value17/ /bean bean iduserService classcom.ycl.service.impl.UserServiceImpl constructor-arg nameuserDao refuserDao/constructor-arg /bean /beans #集合的注入; package com.ycl.domain; public class User { private String name; private String addr; public String getName() { return name; } public void setName(String name) { this.name name; } public String getAddr() { return addr; } public void setAddr(String addr) { this.addr addr; } Override public String toString() { return User{ name name \ , addr addr \ }; } } ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd bean iduserDao classcom.ycl.dao.impl.UserDaoImpl property namestrList list valueaaa/value valuebbb/value valueccc/value /list /property property nameuserMap map entry keyu1 value-refuser1/entry #u1是map的key,user1 是下面的iduser1的bean; entry keyu2 value-refuser2/entry /map /property property nameproperties props prop keyp1ppp1/prop prop keyp2ppp2/prop prop keyp3ppp3/prop /props /property property nameage value17/ /bean bean iduser1 classcom.ycl.domain.User property namename valuetom/ property nameaddr valuebeijing/ /bean bean iduser2 classcom.ycl.domain.User property namename valuelucy/ property nameaddr valuebeijing/ /bean bean iduserService classcom.ycl.service.impl.UserServiceImpl constructor-arg nameuserDao refuserDao/constructor-arg /bean import resourceapplicationContext-user.xml/ import resourceapplicationContext-product.xml/ /beans #引入其他配置文件(分模块开发) 实际开发中spring的配置内容非常多这就导致spring配置很繁杂且体积很大所以可以将部分配置拆解到 其他配置文件中而在spring主配置文件通过import 标签进行加载。 import resourceapplicationContext-xxx.xml #主配置文件。 applicationContext.xml beans bean/bean import resourceapplicationContext-user.xml/ import resourceapplicationContext-product.xml/ /beans #子配置文件 applicationContext-user.xml applicationContext-product.xml bean标签 id 属性:在容器中Bean实例的唯一标识不允许重复。 class 属性:要实例化的Bean的全限定名 scope 属性:Bean的作用范围常用是 Singleton(默认)和prototype; property标签:属性注入。 name属性:属性名称 value:属性:注入的普通属性值 ref属性:注入的对象引用值 list标签 map标签 properties标签 constructor-arg标签 import标签:导入其他的Spring分文件。