Spring_002 依赖注入方式实现
一、Spring的依赖注入(DI)
在Spring框架下,当Bean实例A运行过程中需要引用另外一个Bean实例B时,Spring框架会创建Bean的实例B,并将实例B通过实例A的构造函数、set方法、自动装配和注解方式注入到实例A,这种注入实例Bean到另外一个实例Bean的过程叫做依赖注入。
依赖注入的好处就是尽可能隔离Bean之间的代码耦合,提高Bean重用的可能性,并尽量降低程序代码的维护难度,Spring框架通过依赖注入技术将不同的Bean融合起来,完成复杂业务操作,但又确保了每个Bean相对的独立性。
Spring框架提供构造函数注入、设置方法注入、自动装配注入和注解注入四种注入方式。
1、基于构造函数的依赖注入
BybService.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public class BybService { public String name; public String getName() { return name; } public void setName(String name) { this .name = name; } @Override public String toString() { return "BybService{" + "name='" + name + '\ '' + '}' ; } public String sayByb(){ System.out.println( "Byb" +name); return "Byb" +name; } } |
HelloWorld.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class HelloWorld { private String message; private BybService bybService; public HelloWorld(BybService bybService) { this .bybService=bybService; } public void setMessage(String message) { this .message = message; } public void getMessage() { System.out.println( "message : " + message); } public void sayHello(){ System.out.println(bybService.sayByb()); } } |
Bean.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?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" > <bean id= "helloWorld" class = "HelloWorld" > <constructor-arg ref= "BybService" ></constructor-arg> </bean> <bean id= "BybService" class = "BybService" > <property name= "name" value= "Hello World!" /> </bean> </beans> |
Main.App
1 2 3 4 5 6 7 8 9 10 11 12 | import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainApp { public static void main(String[] args){ ApplicationContext context = new ClassPathXmlApplicationContext( "Bean.xml" ); HelloWorld obj = (HelloWorld) context.getBean( "helloWorld" ); BybService bybService=(BybService) context.getBean( "BybService" ); obj.sayHello(); } } |
运行MainApp.java
2、基于set方法注入(属性注入)
HelloWorld.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | public class HelloWorld { private String message; private BybService bybService; public void setMessage(String message) { this .message = message; } public void getMessage() { System.out.println( "message : " + message); } public void sayHello(){ System.out.println(bybService.sayByb()); } public BybService getBybService() { return bybService; } public void setBybService(BybService bybService) { this .bybService = bybService; } } |
BybService.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public class BybService { public String name; public String getName() { return name; } public void setName(String name) { this .name = name; } @Override public String toString() { return "BybService{" + "name='" + name + '\ '' + '}' ; } public String sayByb(){ System.out.println( "Byb" +name); return "Byb" +name; } } |
Bean.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?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" > <bean id= "helloWorld" class = "HelloWorld" > <property name= "message" value= "Hello World!" /> <property name= "BybService" ref= "BybService" ></property> </bean> <bean id= "BybService" class = "BybService" > <property name= "name" value= "Hello World!" /> </bean> </beans> |
MainApp.java
1 2 3 4 5 6 7 8 9 10 11 12 13 | import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainApp { public static void main(String[] args){ ApplicationContext context = new ClassPathXmlApplicationContext( "Bean.xml" ); HelloWorld obj = (HelloWorld) context.getBean( "helloWorld" ); BybService bybService=(BybService) context.getBean( "BybService" ); obj.sayHello(); } } |
运行MainApp.java
3、注解注入
Bean.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?xml version= "1.0" encoding= "UTF-8" ?> <beans xmlns= "http://www.springframework.org/schema/beans" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:context= "http://www.springframework.org/schema/context" xsi:schemaLocation="http: //www.springframework.org/schema/beans http: //www.springframework.org/schema/beans/spring-beans-2.5.xsd http: //www.springframework.org/schema/context http: //www.springframework.org/schema/context/spring-context-2.5.xsd"> <context:annotation-config /> <bean id= "helloWorld" class = "HelloWorld" > <property name= "message" value= "aaa!" /> </bean> <bean id= "BybService" class = "BybService" > <property name= "name" value= "Hello World!" /> </bean> </beans> |
BybService.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public class BybService { public String name; public String getName() { return name; } public void setName(String name) { this .name = name; } @Override public String toString() { return "BybService{" + "name='" + name + '\ '' + '}' ; } public String sayByb(){ System.out.println( "Byb" +name); return "Byb" +name; } } |
HelloWorld.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import org.springframework.beans.factory.annotation.Autowired; public class HelloWorld { private String message; @Autowired private BybService bybService; public void setMessage(String message) { this .message = message; } public void getMessage() { System.out.println( "message : " + message); } public void sayHello(){ System.out.println(bybService.sayByb()); } } |
MainApp.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainApp { public static void main(String[] args){ ApplicationContext context = new ClassPathXmlApplicationContext( "Bean.xml" ); HelloWorld obj = (HelloWorld) context.getBean( "helloWorld" ); BybService bybService=(BybService) context.getBean( "BybService" ); obj.sayHello(); //bybService.sayByb(); } } |
运行结果如下:
二、Spring注入依赖的时间
Spring在创建beanFactory实例化类的时候,先加载类,然后调用类的构造器进行初始化,在完成初始化进行依赖注入(常见的就是set注入,通过执行set方法)。
三、使用eclipse创建注入Bean实例
继续写我们的第一个Spring程序,这次我们使用依赖注入的方式实现程序
第一步,建立我们的Spring_002程序,并在程序中添加BookDao.java、BookDaoImpl.java、BookService.java、BookServiceImpl.java、
ApplicationContext.xml
第二步 在BookDao接口中配置一个addBook方法
1 2 3 4 5 | package com.zk.myspring; public interface BookDao { public void addBook(); } |
在BookDaoImpl中实现addBook方法
1 2 3 4 5 6 7 8 9 | package com.zk.myspring; public class BookDaoImpl implements BookDao{ @Override public void addBook() { // TODO Auto-generated method stub System.out.println( "addBook" ); } } |
在BookService接口中配置addBook方法
1 2 3 4 5 | package com.zk.myspring; public interface BookService { public abstract void addBook(); } |
在BookServiceImpl方法中实现addBook方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package com.zk.myspring; public class BookServiceImpl implements BookService{ //方式一:接口等于实现类 //private BookDao bookDao=new BookDaoImpl(); //方式二:接口+set方法 private BookDao bookdao; public void setBookdao(BookDao bookdao) { //依赖注入 this .bookdao = bookdao; } @Override public void addBook() { // TODO Auto-generated method stub //this.bookdao.addBook(); System.out.println( "add book" ); } } |
注意在BookServiceImpl文件中,我们使用接口+set方法实现,并在setBookdao方法中实现依赖注入,使得BookService依赖于BookDao
第三步 配置我们的ApplicationContext.xml,使用property属性将BookDao注入进BookService
<property name="bookdao" ref="bookDaoId"></property>
<property> 用于属性注入
name:bean的属性名,通过setter方法获得
ref:另一个bean的id值的引用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?xml version= "1.0" encoding= "UTF-8" ?> <beans xmlns= "http://www.springframework.org/schema/beans" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:util= "http://www.springframework.org/schema/util" xsi:schemaLocation=" http: //www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http: //www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <!-- 创建Dao --> <!-- 模拟spring执行过程 创建Service实例:BookService bookservice= new BookServiceImpl(); IOC <bean> 创建Dao实例:BookDao bookDao= new BookDaoImpl(); IOC 将dao设置给service:bookservice.setBookDao(bookDao); DI <property> <property> 用于属性注入 name:bean的属性名,通过setter方法获得 ref:另一个bean的id值的引用 --> <!--创建Dao --> <bean id= "bookDaoId" class = "com.zk.myspring.BookDaoImpl" ></bean> <!-- 创建service --> <bean id= "bookServiceId" class = "com.zk.myspring.BookServiceImpl" > <property name= "bookdao" ref= "bookDaoId" ></property> </bean> </beans> |
第四步 创建一个test方法,对配置文件进行测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | package com.zk.myspring; import org.junit.Test; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.core.io.ClassPathResource; public class TestBook { public static void main(String[]args) { //从spring容器中获得 String path= "ApplicationContext.xml" ; ApplicationContext ac= new ClassPathXmlApplicationContext(path); BookService bs=(BookService) ac.getBean( "bookServiceId" ); bs.addBook(); } @Test public void test1(){ //使用BeanFactory实例化 String path= "ApplicationContext.xml" ; BeanFactory bf= new XmlBeanFactory( new ClassPathResource(path)); BookService bs=(BookService) bf.getBean( "bookServiceId" ); bs.addBook(); } } |
得出输出
依赖注入方式配置spring成功
三、使用ideal创建Spring依赖注入实例
首先创建一个Spring项目
创建BybService.java、HelloWorld.java、MainApp.java和资源文件Bean.xml
BybService.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class BybService { public String name; public String getName() { return name; } public void setName(String name) { this .name = name; } @Override public String toString() { return "BybService{" + "name='" + name + '\ '' + '}' ; } public void sayByb(){ System.out.println( "Byb" +name); } } |
HelloWorld.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class HelloWorld { private String message; private BybService bybService; public void setMessage(String message) { this .message = message; } public void getMessage() { System.out.println( "message : " + message); bybService.sayByb(); } public BybService getBybService() { return bybService; } public void setBybService(BybService bybService) { this .bybService = bybService; } } |
MainApp.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainApp { public static void main(String[] args){ ApplicationContext context = new ClassPathXmlApplicationContext( "Bean.xml" ); HelloWorld obj = (HelloWorld) context.getBean( "helloWorld" ); BybService bybService=(BybService) context.getBean( "BybService" ); obj.getMessage(); bybService.sayByb(); } } |
Bean.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?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" > <bean id= "helloWorld" class = "HelloWorld" > <property name= "message" value= "Hello World!" /> <property name= "bybService" ref= "BybService" ></property> </bean> <bean id= "BybService" class = "BybService" > <property name= "name" value= "Hello World!" /> </bean> </beans> |
Spring容器可以配置Bean,注入属性,而且可以维护Bean与Bean之间的关系。
<bean>标签的作用是当spring框架加载的时候,spring会自动创建一个bean,并放入内存。当ApplicationContext context = new ClassPathXmlApplicationContext("Bean.xml");执行的时候,Spring容器就会被创建,同时applicationContext.xml中配置,Bean就会被创建放入(内存[HashMap/HashTable])中。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)