依赖注入的三种方式
程序员文章站
2022-06-02 15:15:06
...
构造器注入
该注入方式是在spring容器在创建具体的类的对象的时候是调用的类的构造器,只需要我们创建一个带参数的构造器,然后在配置文件中将构造函数的参数传入该类,则spring在创建该类的时候就会将依赖注入。
注意:spring默认是创建无参构造器的,所以当写了有参构造器后,无参构造器就会失效,这时候我们需要将无参构造函数和有参构造函数一起写出来。
<bean id ="clientDao" class="jee.FileClientDAoImpl"></bean>
<bean id="clientService" class="jee.ClientService">
<!-- 构造器参数 -->
<!-- ref是引用,引用容器中id为clienDaode 一个bean,作为clientService构造器的参数 -->
<!-- name是参数的名字,ref指向的是参数的对象-->
<constructor-arg name="clientDao" ref="clientDao" ></constructor-arg>
</bean>
private ClientDao clientDao;
public ClientService(ClientDao clientDao)
{
System.out.println("ClientService 有参构造器");
this.clientDao=clientDao;
}
setter方法注入
我们需要为参数创建一个set方法。
private ProductDao productDao;
public void setProductDao(ProductDao productDao) {
this.productDao = productDao;
}
配置文件中的代码如下图所示
<bean id="productDao" class="jee.DBProductDaoImpl"></bean>
<bean id= "productService" class="jee.ProductService">
<!-- setter方法注入依赖,调用setProductDao方法注入依赖 -->
<!--通过set方法将ref中对应的对象注入给productDao-->
<property name="productDao" ref="productDao"></property>
</bean>
还可以为一些数值型参数注入值,代码如下
private int num;
private String name;
private Set<String> set;
private List<String> list;
private Properties prop;
private Map<String , String > map;
public void setNum(int num) {
this.num = num;
}
public void setName(String name) {
this.name = name;
}
public void setSet(Set<String> set) {
this.set = set;
}
public void setList(List<String> list) {
this.list = list;
}
public void setProp(Properties prop) {
this.prop = prop;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
<bean id= "productService" class="jee.ProductService">
<!--<property name="productDao" ref="productDao"></property> -->
<!-- setter方法注入依赖 -->
<property name="productDao">
<!-- 创建一个匿名的bean注入到productDao属性中 -->
<bean class="jee.DBProductDaoImpl"></bean>
</property>
<property name="num" value="10"></property>
<property name="name" value="篮球"></property>
<property name="set">
<set>
<value>setv1</value>
<value>setv2</value>
<value>setv3</value>
</set>
</property>
<property name="list">
<list>
<value>listv1</value>
<value>listv2</value>
<value>listv3</value>
</list>
</property>
<property name="prop">
<props>
<prop key="k1">v1</prop>
<prop key="k2">v2</prop>
<prop key="k3">v3</prop>
</props>
</property>
<property name="map">
<map>
<entry key="k1" value="v1"></entry>
<entry key="k2" value="v2"></entry>
<entry key="k3" value="v3"></entry>
</map>
</property>
</bean>
注解注入
加入context命名空间
https://docs.spring.io/spring/docs/5.1.17.BUILD-SNAPSHOT/spring-framework-reference/core.html#beans-annotation-config
上面是官网地址,可以从官方文档中找到命名空间的配置
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 可以**@Autowired、@Resource @PostConstruct、@PreDestory注解-->
<context:annotation-config></context:annotation-config>
</bean>
</beans>
当我们需要注入的时候,只需要在需要注入的变量上面写上注解即可
//依赖注入
//会从容器中搜索一个clienDao类型的注入
//@Autowired会从容器中搜索一个ClientDao类型的实例,并将此实力注入给clienDao对象
//@Autowired默认要求必须存在一个clientDao类型的bean
//@Resource(name = "clientDao")从容器中寻找一个id名字为clientDao的实例,并将此实例注入给clienDao对象
//@Resource默认是按名称搜索
//@Autowired默认按照类型搜索
@Qualifier("clientDao")//寻找一个id为clientDao的bean
private ClientDao clientDao;
下一篇: java实现发送手机验证码功能