将代码解耦进行到底...
设计思想
,可以用来减低计算机代码之间的耦合度。其中最常见的实现方式
叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。public class A {
private B b;
}
public class B {
}
public class Test {
//注入对象b
public static void main(String[] args) {
try {
Class<?> aClass = Class.forName("A全路径名");
Class<?> bClass = Class.forName("B全路径名");
//反射生成对象
Object A_object = aClass.getDeclaredConstructor().newInstance();
Object B_object = bClass.getDeclaredConstructor().newInstance();
//字段声明是private的,不能用getField方法,应该使用getDeclaredField方法来获取
Field field = aClass.getDeclaredField("b");
//字段声明为private,必须进行此操作
field.setAccessible(true);
//给字段注入对象
field.set(A_object, B_object);
} catch (ClassNotFoundException | NoSuchFieldException | InstantiationException | InvocationTargetException | NoSuchMethodException | IllegalAccessException e) {
e.printStackTrace();
}
}
}
<!-- 属性注入 -->
<bean id="car" class="com.spring.model.Car">
<property name="maxSpeed" value="200"></property>
<property name="brand" value="红旗CA72"></property>
<property name="price" value="200000.00"></property>
</bean>
package com.spring.model;
public class Car {
private int maxSpeed;
private String brand;
private double price;
public int getMaxSpeed() {
return maxSpeed;
}
//一定要写被注入对象的set方法
public void setMaxSpeed(int maxSpeed) {
this.maxSpeed = maxSpeed;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
<constructor-arg>
节点,该节点有四个属性:
index
是索引,指定注入的属性位置,从0开始;type
是指该属性所对应的类型;ref
是指引用的依赖对象;value
当注入的不是依赖对象,而是基本数据类型时,就用value;<!-- 构造函数注入(按类型匹配) -->
<bean id="car1" class="com.spring.model.Car">
<constructor-arg type="int" value="300"></constructor-arg>
<constructor-arg type="java.lang.String" value="宝马"></constructor-arg>
<constructor-arg type="double" value="300000.00"></constructor-arg>
</bean>
package com.spring.model;
public class Car {
private int maxSpeed;
private String brand;
private double price;
//带参构造方法
public Car(int maxSpeed,String brand, double price){
this.maxSpeed=maxSpeed;
this.brand=brand;
this.price=price;
}
}
<context:component-scan base-package="">
,base-package
属性指定要自动检测扫描的包。该配置会自动扫描指定的包及其子包下面被构造型注解标注的类,并将这些类注册为spring bean,这样就不用在配置文件一个一个地配置成bean标签。构造型注解包括:@Controller
,@Component
,@Service
,@Repositoryt
标注的自定义注解。@Autowired
,@Qualifier
,@Named
,@Resource
,@Inject
。但是要使用这些注解,需要在配置文件中配置<context:annotation-config />
。只有加上这一配置,才可以使用注解进行spring bean的自动装配,默认情况下基于注解的装配是被禁用的。 @Component
public class TestService {
@Autowired
private TestDao testDao;
public List<Files> selectAll() {
List<Files> filesList = testDao.selectAll();
return filesList;
}
}