一 什么是依赖注入
通过类setXxx函数,有参构造函数或注解形式为类的成员属性附上值
二 依赖注入有以下方法
下面这几张注入方式经常碰到,在工作一段时间后,沉下心翻看源码后,多年的疑惑才解开。
1 通过xml配置文件为类实例属性附上值常用有
1.1 bean子标签<property name="name" value="test"/>标签配上值,property标签的name属性值在类中需要对应public权限setXxx函数如下
XML文件配置
<bean id="dataSource" class="test.Db">
<property name="name" value="QQ"/>
</bean>
JAVA类构建
package test
public class Db {
private String name
public void setName(String name) {
this.name = name
}
}
1.2 bean子标签<constructor-arg name="name" value="test"/>标签配上值,constructor-arg标签的name属性值,在类中构造函数需要对应参数如下
XML文件配置
<bean id="dataSource" class="test.Db" >
<constructor-arg name="name" value="qq"/>
</bean>
JAVA类构建
public class Db {
private String name
public Db(String name) {
this.name = name
}
}
2 类属性加上属性自动注入注解
package test
public class Db {
@Value("${name}")
private String name
}
package test
public class Db {
@Autowired
private X x
}
package test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.annotation.Value
import org.springframework.stereotype.Controller
import org.springframework.stereotype.Service
@Service
public class X {
}
三 依赖注入原理
上面的几种形式在实际项目经常碰到,如何实现呢?
1 基于bean子标签property注入原理
1.1 加载bean配置文件,解析bean标签属性值,赋值给BeanDefinition实例并存进集合中,执行
finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory),实例化bean(使用反射技术实例化)。
再调用populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw),内部执行使用反射技术(
ReflectionUtils.makeAccessible(writeMethod)
writeMethod.invoke(getWrappedInstance(), value)writeMethod为Method实例),最后调用函数setXxx为属性赋值。
2 基于bean子标签constructor-arg注入原理
2.1 加载bean配置文件,解析bean标签属性值,赋值给BeanDefinition实例并存进集合中,执行
finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory),当bean的factoryMethodName属性值为空,bean的有参构造函数多个且调用了。执行函数autowireConstructor(String beanName, RootBeanDefinition mbd, @Nullable Constructor<?>[] ctors, @Nullable Object[] explicitArgs)传入参数。
通过BeanDefinition的成员属性constructorArgument获取构造函数参数,
再执行函数
resolveConstructorArguments(String beanName, RootBeanDefinition mbd, BeanWrapper bw,ConstructorArgumentValues cargs, ConstructorArgumentValues resolvedValues)传入参数,循环遍历构造函数实例,获取出匹配的构造函数。
通过反射实例化并通过构造函数参数为类属性赋值(即执行ctor.newInstance(argsWithDefaultValues),ctor为Constructor<T>类型)。
3 基于注解注入待续
spring boot 基本依赖
1.基础核心依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId> <version>1.5.1.RELEASE</version>
</parent>
2.web应用依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
3.使用freemark依赖(不和web应用依赖共存)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
</dependencies>
扩充一下:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)