JAVA框架 Spring 依赖注入
Posted evil_liu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA框架 Spring 依赖注入相关的知识,希望对你有一定的参考价值。
一:介绍
情景:我们在给程序分层的时候:web层、业务层、持久层,各个层之间会有依赖。比如说:业务层和持久层,业务层的代码在调用持久层的时候,传统方式:new 持久层类。
进而进行调用,这种方式会导致耦合性较高,在修改一层代码的时候,另一层的也需要更改代码。不利于维护。这种关系叫做“依赖”。
如何解决?
解决:
Spring给咱们提供依赖注入,也就是说当一个类的对象注入的时候,伴随着他依赖的类也注入。
代码:
1)传统方式:
1 package jd.com.service; 2 3 import jd.com.dao.UserDaoImpl; 4 import org.junit.Test; 5 6 public class UserServiceImpl implements UserService { 7 @Test 8 @Override 9 public void save() { 10 System.out.println("业务层调用持久层。"); 11 //传统方式 12 UserDaoImpl userDao=new UserDaoImpl(); 13 userDao.save(); 14 } 15 }
这种方式导致各个层之间耦合性较高。
2)set方式依赖注入(类):
set方式:被依赖的类需要设置成字段,并且提供set方法。
private UserDaoImpl userDao;
public void setUserDao(UserDaoImpl userDao) {
this.userDao = userDao;
}
被依赖的来:
1 package jd.com.dao; 2 3 public class UserDaoImpl implements UserService{ 4 @Override 5 public void save() { 6 System.out.println("持久层保存数据。"); 7 } 8 }
调用的类:
1 package jd.com.service; 2 3 import jd.com.dao.UserDaoImpl; 4 import org.junit.Test; 5 6 public class UserServiceImpl implements UserService { 7 //set方式 8 9 private UserDaoImpl userDao; 10 11 public void setUserDao(UserDaoImpl userDao) { 12 this.userDao = userDao; 13 } 14 15 public void save(){ 16 System.out.println("业务层调用持久层。"); 17 userDao.save(); 18 } 19 }
测试类:
1 package jd.com.service; 2 3 import org.junit.Test; 4 import org.springframework.context.ApplicationContext; 5 import org.springframework.context.support.ClassPathXmlApplicationContext; 6 7 public class Testdemo { 8 @Test 9 public void testdemo(){ 10 ApplicationContext ac= new ClassPathXmlApplicationContext("applicationContext.xml"); 11 UserService userService= (UserService) ac.getBean("userserv"); 12 userService.save(); 13 14 } 15 }
配置文件配置:
1 <bean id="dao" class="jd.com.dao.UserDaoImpl" /> 2 <!--如果是类的数需要使用ref 值为被依赖的类的id名字--> 3 <bean id="userserv" class= "jd.com.service.UserServiceImpl" > 4 <property name="userDao" ref="dao" /> 5 </bean>
3)set方法(设置字段):
字段注入也类似上面但是这种方式配置文件是不一样的。
配置文件:
1 <bean id="userserv" class= "jd.com.service.UserServiceImpl" > 2 <property name="userDao" ref="dao" /> 3 <!--name是属性key value是属性value--> 4 <property name="oop" value="java"/> 5 </bean>
代码:需要设置set方法
1 public String oop; 2 3 public void setOop(String oop) { 4 this.oop = oop; 5 }
1 @Test 2 public void test(){ 3 ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml"); 4 UserServiceImpl userService= (UserServiceImpl) ac.getBean("userserv"); 5 System.out.println(userService.oop); 6 }
4)构造方法依赖注入:
依赖类:在构造方法中进行属性设置.
1 package jd.com.service; 2 3 import jd.com.dao.UserDaoImpl; 4 5 6 public class UserServiceImpl implements UserService { 7 8 9 public String ko; 10 public String ok; 11 private UserDaoImpl userDao; 12 13 14 public UserServiceImpl (UserDaoImpl userDao ,String ko ,String ok){ 15 this.userDao=userDao; 16 this.ko=ko; 17 this.ok=ok; 18 } 19 20 21 22 public void save(){ 23 System.out.println("业务层调用持久层。"); 24 userDao.save(); 25 } 26 }
测试代码:
1 @Test 2 public void test2(){ 3 ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml"); 4 UserServiceImpl us= (UserServiceImpl) ac.getBean("userserv"); 5 us.save(); 6 System.out.println(us.ok); 7 System.out.println(us.ko); 8 } 9 }
配置文件配置:需要注意标签是:1、constructor-arg 2、index和name不能混合使用。3、属性是其他类的时候需要注意使用ref=“类的配置文件id”
1 <bean id="userserv" class="jd.com.service.UserServiceImpl"> 2 <constructor-arg name="userDao" ref="dao" /> 3 <constructor-arg name="ko" value="python" /> 4 <constructor-arg name="ok" value="java" /> 5 </bean> 6 <bean id="dao" class="jd.com.dao.UserDaoImpl" />
以上是关于JAVA框架 Spring 依赖注入的主要内容,如果未能解决你的问题,请参考以下文章
spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段