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{ @Override public 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; } @Override public 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; } @Override public 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();//看它是否三层关联调用方法 } }
运行结果(控制层显示出数据访问层方法结果,三层关联成功):