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();
}
}