欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

依赖注入的三种方式

程序员文章站 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;
相关标签: ssm框架学习