spring框架源码八、spring ioc xml模式的依赖注入配置

spring ioc xml模式的依赖注入配置

spring依赖注入有两种方式。

1、setter

setter注入使用property标签,注入普通值使用value属性,注入其它的bean使用ref属性。

    <!-- setter注入使用property标签,注入普通值使用value属性,注入其它的bean使用ref属性 -->
	
    <bean id="testDao" class="com.duohoob.spring.dao.TestDaoImpl" scope="singleton" init-method="init" destroy-method="destroy">
    	<property name="result" value="success"/>
    </bean>
	
    <bean id="testService" class="com.duohoob.spring.service.TestServiceImpl">
    	<property name="testDao" ref="testDao"/>
    </bean>

TestDao

package com.duohoob.spring.dao;

/**
 * @author yangwei
 *
 * @date 2022年10月18日
 */
public class TestDaoImpl implements TestDao {

	private String result;
	
	public TestDaoImpl() {
		
	}

	public TestDaoImpl(String result) {
		this.result = result;
	}

	@Override
	public String test() {
		// TODO Auto-generated method stub
		return result;
	}

	public void init() {
		System.out.println("创建对象");
	}
	
	public void destroy() {
		System.out.println("销毁对象");
	}

	public String getResult() {
		return result;
	}

	public void setResult(String result) {
		this.result = result;
	}
	
}

TestServiceImpl

package com.duohoob.spring.service;

import com.duohoob.spring.dao.TestDao;
import com.duohoob.spring.factory.BeanFactory;

/**
 * @author yangwei
 *
 * @date 2022年10月17日
 */
public class TestServiceImpl implements TestService {

//	private TestDao testDao = new TestDaoImpl();
	
	/**
	 * 改为从工厂获取
	 */
//	private TestDao testDao = (TestDao) BeanFactory.getBean("testDao");
	
	/**
	 * 最佳方式
	 */
	private TestDao testDao;
	
	// 通过set赋值
	public void setTestDao(TestDao testDao) {
		this.testDao = testDao;
	}

	@Override
	public String test() {
		// TODO Auto-generated method stub
		String result = testDao.test();
		return result;
	}

}

2、构造函数

构造器注入使用constructor-arg注入,注入普通值使用value属性,注入另外的bean使用ref属性。

   	<!-- 构造器注入使用constructor-arg注入,注入普通值使用value属性,注入其它的bean使用ref属性 -->
    <bean id="testDao" class="com.duohoob.spring.dao.TestDaoImpl" scope="singleton" init-method="init" destroy-method="destroy">
    	<!-- index是构造方法中参数的位置 -->
    	<constructor-arg index="0" value="success"/>
    	<!-- OR -->
    	<!-- name是构造方法中参数的名称 -->
    	<constructor-arg name="result" value="success"/>
    </bean>

注入复杂属性

    <bean id="testDao" class="com.duohoob.spring.dao.TestDaoImpl" scope="singleton" init-method="init" destroy-method="destroy">
    	<!-- 数组 -->
    	<property name="myarray">
    		<array>
    			<value>str1</value>
    			<value>str2</value>
    			<value>str3</value>
    		</array>
    	</property>
    	
    	<!-- map -->
    	<property name="mymap">
    		<map>
    			<entry key="str1" value="value1"></entry>
    			<entry key="str2" value="value2"></entry>
    			<entry key="str3" value="value3"></entry>
    		</map>
    	</property>
    	
    	<!-- set -->
    	<property name="myset">
    		<set>
    			<value>str1</value>
    			<value>str2</value>
    			<value>str3</value>
    		</set>
    	</property>
    	
    	<!-- properties -->
    	<property name="myproperties">
    		<props>
    			<prop key="prop1">str1</prop>
    			<prop key="prop2">str2</prop>
    			<prop key="prop3">str3</prop>
    		</props>
    	</property>
    </bean>

TestDaoImpl

package com.duohoob.spring.dao;

import java.util.Map;
import java.util.Properties;
import java.util.Set;

/**
 * @author yangwei
 *
 * @date 2022年10月18日
 */
public class TestDaoImpl implements TestDao {

	private String result;
	
	private String[] myarray;
	
	private Map<String, Object> mymap;
	
	private Set<String> myset;
	
	private Properties myproperties;
	
	public TestDaoImpl() {
		
	}

	public TestDaoImpl(String result) {
		this.result = result;
	}

	@Override
	public String test() {
		// TODO Auto-generated method stub
		return result;
	}

	public void init() {
		System.out.println("创建对象");
	}
	
	public void destroy() {
		System.out.println("销毁对象");
	}

	public String getResult() {
		return result;
	}

	public void setResult(String result) {
		this.result = result;
	}

	public String[] getMyarray() {
		return myarray;
	}

	public void setMyarray(String[] myarray) {
		this.myarray = myarray;
	}

	public Map<String, Object> getMymap() {
		return mymap;
	}

	public void setMymap(Map<String, Object> mymap) {
		this.mymap = mymap;
	}

	public Set<String> getMyset() {
		return myset;
	}

	public void setMyset(Set<String> myset) {
		this.myset = myset;
	}

	public Properties getMyproperties() {
		return myproperties;
	}

	public void setMyproperties(Properties myproperties) {
		this.myproperties = myproperties;
	}
	
}

debug测试有没有注入

package com.duohoob.spring;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

@SpringBootTest
class ApplicationTests {

	@Test
	void contextLoads() {
		
	}

	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("classpath:application-context.xml");
		Object bean = context.getBean("testDao");
		System.out.println(bean);
		((AbstractApplicationContext) context).close();
	}
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值