Spring IOC 的常见注入方法有3种:Setter注入、构造注入和属性注入。想了解更多可点击链接:Spring 注入、注解及相关概念补充
属性注入 不推荐。原因:使用私有的成员属性变量,依靠反射实现,破坏封装,只能依靠 IOC 容器实现注入,不严谨。所以我只演示Setter注入和构造注入。本篇演示构造注入
Setter注入和构造注入很像,Setter注入使用 setter 方法,xml 配置文件 DI 注入使用子标签 property; 构造注入使用构造方法,xml 配置文件 DI 注入使用子标签 constructor-arg
首先新建项目,可参考:初识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.service; import com.apesource.dao.IStudentDao; public class StudentServiceImp implements IStudentService{ /*因为 service 层调用数据访问层 *我们得将 dao 层与 service 联系起来 *拿到一个 实现dao层方法的变量,又由于我们要使用构造方法注入 * 所以我们要写它的构造方法(有参、无参都要写)*/ IStudentDao dao; /***有参构造***/ public StudentServiceImp(IStudentDao dao) { this.dao = dao; } /***无参构造***/ public StudentServiceImp() { } @Override public void save() { System.out.println("===service的新增方法==="); 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 层方法的变量,又由于我们要使用构造方法注入 * 所以我们要写它的构造方法(有参、无参都要写*/ IStudentService service; /***有参构造***/ public StudentControllerImp(IStudentService service) { this.service = service; } /***无参构造***/ public StudentControllerImp() { } @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实现,子标签-->
<!--constructor-arg 子标签,就用于构造注入,它也会有自动生成的 name,可以改自己起的名,自动生成很方便-->
<!--constructor-arg的name指要通过构造给注入的属性名-->
<!--constructor-arg的value指要通过构造给注入的数据,写具体值-->
<!--constructor-arg的ref可以直接引用标签id-->
<!--constructor-arg的index指要注入的数据下标,后面复杂类型篇章会讲到它的用法-->
<!--constructor-arg的type指要注入的数据类型,后面复杂类型篇章会讲到它的用法-->
<bean id="serviceImp" class="com.apesource.service.StudentServiceImp">
<!--通过 setter给注入的dao(就我们service层添加的那个dao层的属性【IStudentDao dao】),ref可以直接引用数据访问层id,这样两层就关联起来了,控制层同理-->
<constructor-arg name="dao" ref="daoImp"></constructor-arg>
</bean>
<!--注入控制器——controller实现类-->
<!--控制层需要业务层对象注入,DI实现-->
<bean id="controllerImp" class="com.apesource.controller.StudentControllerImp">
<constructor-arg name="service" ref="serviceImp"></constructor-arg>
</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();//看它是否三层关联调用方法
}
}
标签:演示,service,DI,Spring,dao,apesource,com,public,注入 From: https://blog.csdn.net/2303_79008526/article/details/141256843运行结果(控制层显示出数据访问层方法结果,三层关联成功):