控制反转( Inversion of Control ),是一种设计思想,而依赖注入( DI )是一种实现的方法。原本对象的创建是依靠程序员来创建,通过依赖注入的方法来改造后,对象的创建是依赖IOC容器,对象的属性依赖IOC容器注入。
依赖注入:set注入
依赖:Bean对象的创建依赖容器
注入:Bean对象所有属性由容器注入
Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。
package service; import dao.UserDAO; public class UserServiceImpl { private UserDAO userDAO; public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } public void getUser() { userDAO.getUser(); } }
package dao; public class UserDAOImpl implements UserDAO { public void getUser() { System.out.println("userDAOImpl"); } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:c="http://www.springframework.org/schema/c" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="a" class="dao.UserDAOImpl"/> <bean id="hello" class="service.UserServiceImpl" > <property name="userDAO" ref="a"/> </bean> </beans>
public class MyTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); UserServiceImpl test = context.getBean("hello", UserServiceImpl.class); test.getUser(); } }
构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
XML配Bean代码
<?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="userDaoImpl" class="dao.UserDAOImpl"/> <bean id="construct" class="ConstructDi.UserServiceImpl"> <constructor-arg ref="userDaoImpl"/> </bean> </beans>
public class MyConstructTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("constructDiBean.xml"); UserServiceImpl construct = context.getBean("construct", UserServiceImpl.class); construct.getUserDAO().getUser(); } }
@Autowired默认按类型装配
@Qualifier和Autowired配合使用,指定bean的名称
@Resource默认按名称装配,当找不到与名称匹配的bean时,才会按类型装配。
例子:人有狗和猫,两种宠物通过不同的方式注入。
三个实体类分别为:人、猫、狗
package pojo; @Component public class People { @Autowired @Qualifier("cat") Cat cat; @Resource Dog dog; public Cat getCat() { return cat; } public Dog getDog() { return dog; } @Override public String toString() { return "People{" +" cat=" + cat.name + ", dog=" + dog.name + '}'; } }
package pojo; @Component public class Cat { public String name="catName"; public void shout(){ System.out.println("Cat shout!"); } public String getName() { return name; } public void setName(String name) { this.name = name; } }
package pojo; import org.springframework.stereotype.Component; @Component public class Dog { String name="dogName"; public void shout(){ System.out.println("Dog shout!"); } public String getName() { return name; } public void setName(String name) { this.name = name; } }
<?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.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="pojo"/> <context:annotation-config/> </beans>
public class MyTest { @Test public void test3(){ ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); People people = context.getBean("people", People.class); people.getCat().shout(); people.getDog().shout(); System.out.println(people.toString()); } }
结果:
Cat shout!
Dog shout!
People{ cat=catName, dog=dogName}
public class ClassA { private InterfaceB clzB; public void doSomething() { Ojbect obj = Class.forName(Config.BImplementation).newInstance(); clzB = (InterfaceB)obj; clzB.doIt(); }
本人学识有限,如果有错,欢迎指出。