spring依赖注入的方式有4种
构造方法注入
属性注入
工厂注入
注解注入
下面通过一个实例统一讲解:
User.java
packagecom.bjsxt.model;public classUser {privateString username;privateString password;publicUser(){}publicUser(String username, String password) {super();this.username =username;this.password =password;
}publicString getUsername() {returnusername;
}public voidsetUsername(String username) {this.username =username;
}publicString getPassword() {returnpassword;
}public voidsetPassword(String password) {this.password =password;
}
@OverridepublicString toString() {return "User [username=" + username + ", password=" + password + "]";
}
}
UserDAO.java
packagecom.bjsxt.dao;importcom.bjsxt.model.User;public interfaceUserDAO {public voidsave(User user);
}
UserDAO实现类UserDAOImpl
packagecom.bjsxt.dao.impl;importcom.bjsxt.dao.UserDAO;importcom.bjsxt.model.User;public class UserDAOImpl implementsUserDAO {public voidsave(User user) {//Hibernate//JDBC//XML//NetWork
System.out.println("user saved!");
}
}
工厂类
第一个:UserFactory
packagecom.bjsxt.factory;importcom.bjsxt.model.User;public classUserFactory {publicUser CreatUser () {
User user=newUser();
user.setUsername("周1");
user.setPassword("oumyye");returnuser;
}
}
第二个:UserFactory2
packagecom.bjsxt.factory;importcom.bjsxt.model.User;public classUserFactory2 {public staticUser CreatUser () {
User user=newUser();
user.setUsername("偶my耶1");
user.setPassword("oumyye");returnuser;
}
}
控制层:UserService
packagecom.bjsxt.service;importcom.bjsxt.dao.UserDAO;importcom.bjsxt.model.User;public classUserService {privateUserDAO userDAO;public voidinit() {
System.out.println("###########init");
}public voidsave(User user) {
userDAO.save(user);
}publicUserDAO getUserDAO() {returnuserDAO;
}public voidsetUserDAO(UserDAO userDAO) {this.userDAO =userDAO;
}publicUserService(UserDAO userDAO) {super();this.userDAO =userDAO;
}public voiddestroy() {
System.out.println("destroy");
}
}
配置文件:bean.xml
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
测试类:
packagecom.bjsxt.service;import static org.junit.Assert.*;importorg.junit.Test;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;importcom.bjsxt.model.User;public classUserServiceTest {
@Testpublic voidtest() {
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("beans.xml");
UserService userService=(UserService) applicationContext.getBean("userService");//构造方法注入
User user=(User) applicationContext.getBean("user");//属性注入
User user1=(User) applicationContext.getBean("user1");//工厂注入
User user2=(User) applicationContext.getBean("user2");//工厂注入
User user3=(User) applicationContext.getBean("user3");
System.out.println(user);
System.out.println(user1);
System.out.println(user2);
System.out.println(user3);
userService.save(user);
userService.destroy();
}
}
结果:
###########init
User [username=zhou, password=password]
User [username=zhang, password=oumyye]
User [username=周1, password=oumyye]
User [username=偶my耶1, password=oumyye]
user saved!destroy
注解方式在后面详细介绍
依赖注入—自动装配
Spring中提供了自动装配依赖对象的机制,但是在实际应用中并不推荐使用自动装配,因为自动装配会产生未知情况,开发人员无法预见最终的装配结果。
自动装配是在配置文件中实现的,如下:
只需要配置一个autowire属性即可完成自动装配,不用再配置文件中写,但是在类中还是要生成依赖对象的setter方法。
Autowire的属性值有如下几个:
· byType 按类型装配 可以根据属性类型,在容器中寻找该类型匹配的bean,如有多个,则会抛出异常,如果没有找到,则属性值为null;
· byName 按名称装配 可以根据属性的名称在容器中查询与该属性名称相同的bean,如果没有找到,则属性值为null;
· constructor 与byType方式相似,不同之处在与它应用于构造器参数,如果在容器中没有找到与构造器参数类型一致的bean,那么将抛出异常;
· autodetect 通过bean类的自省机制(introspection)来决定是使用constructor还是byType的方式进行自动装配。如果发现默认的构造器,那么将使用byType的方式。