Spring IOC 的常见注入方法有3种:Setter注入、构造注入和属性注入。想了解更多可点击链接:Spring 注入、注解以及相关内容补充
属性注入 不推荐。原因:使用私有的成员属性变量,依靠反射实现,破坏封装,只能依靠 IOC 容器实现注入,不严谨。所以我只演示Setter注入和构造注入。本篇演示Setter注入
首先新建项目,可参考 初识IDEA、模拟三层--控制层、业务层和数据访问层
一、spring 环境搭建
(一)pom.xml 导相关坐标
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion>
<!-- 导坐标,不导入该坐标会影响xml文件创建
导完坐标,一定去该页面右边点开 Maven看看是否下载完成,
若不报错,即下载成功--><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.28</version></dependency></dependencies><groupId>org.example</groupId><artifactId>Spring_ioc_04</artifactId><version>1.0-SNAPSHOT</version></project>
(二)搭建配置文件
依次点击:src ==> main ==> resource 右击 ==> New ==> 找 XML Configuration File ==> 找到 Spring Config 并点击,起名(自己随便起名字),为了好区分,我起名叫 applicationContext
(三)建包建类,写方法
建包建类,写方法可参考模拟三层--控制层、业务层和数据访问层,我们建立dao 包、 service 包、controller 包和 test 包。dao 包、 service 包和 controller 包这三个包分别写三层的接口和实现类,名字随便起的,习惯了“Student”,我给所有的名字都包含了“Student” ,其实“Student”没啥意义,“IUserDao"或”bsygd"这样随便的名字都行,什么的名字都一样的意义,取名自己好区分好记住就行(不过为了好区分,最好数据访问层、业务层、控制层起名都包含各自的dao 、service、controller字样,接口都 I 开头、实现类都 imp 结尾)。text 包就写测试类,因为本片文章简单演示而已,我们就简单的给每个接口写个 save() 新增方法给大家演示吧,具体代码如下:
//dao 数据访问层的接口 package com.apesource.pojo.dao;public interface IStudentDao {public void save(); }
//dao 数据访问层的实现类 package com.apesource.pojo.dao;public class StudentDaoImp implements IStudentDao{@Overridepublic void save() {System.out.println("===dao的新增方法===");} }
//service 业务层接口 package com.apesource.pojo.service;public interface IStudentService {public void save(); }
//service 业务层实现类 package com.apesource.pojo.service;import com.apesource.pojo.dao.IStudentDao;public class StudentServiceImp implements IStudentService{/*因为 service 层调用数据访问层*我们得将 dao 层与 service 联系起来*拿到一个 实现dao层方法的变量,又由于我们要使用 setter 方法注入* 所以我们要写它的 setter 方法*/IStudentDao dao;public void setDao(IStudentDao dao) {this.dao = dao;}@Overridepublic void save() {System.out.println("===service的新增方法===");//调用 dao 层方法dao.save();} }
//controller 控制层接口 package com.apesource.pojo.controller;public interface IStudentController {public void save(); }
//controller 控制层的实现方法 package com.apesource.pojo.controller;import com.apesource.pojo.dao.IStudentDao; import com.apesource.pojo.service.IStudentService;public class StudentControllerImp implements IStudentController{/*因为 controller 层调用数据访问层*我们得将 controller 层与 service 联系起来*拿到一个实现 service 层方法的变量,又由于我们要使用 setter 方法注入* 所以我们要写它的 setter 方法*/IStudentService service;public void setService(IStudentService service) {this.service = service;}@Overridepublic void save() {System.out.println("===contro的新增方法===");//调用 service 层方法service.save();} }
(四)找到需要以解耦方式获取实例的类,将需要spring管理的类注入,通过 application.xml 配置文件的操作
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--注入数据访问——dao实现类--><!--<bean id="可以自己起名,先写 class,再写 id,系统会自动生成 id 名,很方便" class="实现类或需要解耦的类的路径"></bean>--><bean id="daoImp" class="com.apesource.dao.StudentDaoImp"></bean><!--注入业务——service实现类--><!--业务层需要数据访问层层对象注入,DI实现,子标签--><!--property 子标签,就用于 setter 注入,它也会有自动生成的 name,可以改自己起的名,自动生成很方便--><!--property的name指要通过 setter给注入的属性名--><!--property的value指要通过 setter给注入的数据,写具体值--><!--property的ref可以直接引用标签id--><bean id="serviceImp" class="com.apesource.service.StudentServiceImp"><!--通过 setter给注入的dao(就我们service层添加的那个dao层的属性【IStudentDao dao】),ref可以直接引用数据访问层id,这样两层就关联起来了,控制层同理--><property name="dao" ref="daoImp"></property></bean><!--注入控制器——controller实现类--><!--控制层需要业务层对象注入,DI实现--><bean id="controllerImp" class="com.apesource.controller.StudentControllerImp"><property name="service" ref="serviceImp"></property></bean>
</beans>
(五)测试类
package com.apesource.test;import com.apesource.controller.IStudentController; import org.springframework.context.support.ClassPathXmlApplicationContext; //注意:千万不要忘记 main 主方法 public class Test01 {public static void main(String[] args) {//1.加载 Spring 核心配置文件,获取 Spring 容器对象//applicationContext.xml为建完坐标下一步自己建立的那个 xml 配置文件的名字ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");//2.获取对象【.getBean("controllerImp")这个controllerImp是 xml 配置文件控制层标签的 id】IStudentController controllerImp = (IStudentController) applicationContext.getBean("controllerImp");controllerImp.save();//看它是否三层关联调用方法} }
运行结果(控制层显示出数据访问层方法结果,三层关联成功):