Bean自动装配
Bean自动装配的方式:
- byName:根据名称自动装配 ,检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配
- byType:根据类型自动装配, 检查容器中一个与指定属性类型相同的bean,那就将其与该属性自动装配,如果存在多个 Spring将无法判断哪个Bean最合适该属性,抛出异常,如果没有找到,则什么事也没发生。
- constructor:根据构造器自动装配 与byType相似,如果容器中没有找到与构造器参数类型一致的bean,那么抛出异常。不推荐使用
一,byName自动装配
bean.xml 配置autowire="byName" 即可
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="textId" class="Automatically.ByName.Text" autowire="byName"></bean> <!-- 注意按名字注入,id名称需与属性名名称相同 --> <bean id="speak" class="Automatically.ByName.Speak"></bean> </beans>
TestDao:自动装配,只需写入set方法
public class TextDao { private TestService speak; public void say(){ System.out.println("Text Start"); speak.say(); } //自动装配,只需写入set方法 配置autowire="byName" 即可 public void setSpeak(TestService speak) { this.speak=speak; } }
TestService:
public class TestService { public void say(){ System.out.println("Speak----say方法被执行-----"); } }
TestMain :测试类
public class TestMain { @Test public void Test(){ ApplicationContext context=new ClassPathXmlApplicationContext("Bean.xml"); TextDao textDao = (TextDao) context.getBean("textId"); textDao.say(); } }
运行结果:
二、byType自动装配
bean.xml 与byName相似 只需修改autowire="byName" 为autowire="byType"
TestDao 与byName一样
TestService 与byName一样
TestMain 与byName一样
运行结果:
三、constructor 自动装配
bean.xml 与byName相似 只需修改autowire="byName" 为autowire="constructor"
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- 这种模式与 byType 非常相似,但它应用于构造器参数。Spring 容器看作 beans, 在 XML 配置文件中 beans 的 autowire 属性设置为 constructor。然后, 它尝试把它的构造函数的参数与配置文件中 beans 名称中的一个进行匹配和连线。 如果找到匹配项,它会注入这些 bean,否则,它会抛出异常 --> <bean id="textId" class="Automatically.AutoConstructor.TestDao" autowire="constructor"> </bean> <bean id="testService" class="Automatically.AutoConstructor.TestService"></bean> </beans>
TestDao : 与上两个不一样的是没有set方法只有构造方法
public class TestDao { private TestService speak; public TestDao(TestService speak){ this.speak = speak; } public void say(){ System.out.println("TestDao Start:"); speak.say(); } }
TestService 与byName一样
TestMain 与byName一样
运行结果: