1. 程式人生 > 其它 >07_Spring Bean 自動裝配 byName byType constructor autodetect no <bean> 元素的 autowire 屬性

07_Spring Bean 自動裝配 byName byType constructor autodetect no <bean> 元素的 autowire 屬性

技術標籤:Spring Frameworkspringspring自動裝配ByNameByType

Spring Bean 自動裝配

spring自動裝配可以簡化spring配置。

<bean> 元素的 autowire 屬性。autowire 屬性有五個值

自動裝配的5中型別

名稱說明
byName根據 Property 的 name 自動裝配 ,如果一個 Bean 的 name 和另一個 Bean 中的 Property 的 name 相同,則自動裝配這個 Bean 到 Property 中。注意:set方法名
byType根據 Property 的資料型別(Type)自動裝配,如果一個 Bean 的資料型別相容另一個 Bean 中 Property 的資料型別,則自動裝配。
constructor根據構造方法的引數的資料型別,進行 byType 模式的自動裝配。
autodetect如果發現預設的構造方法,則用 constructor 模式,否則用 byType 模式
no預設情況下,不使用自動裝配,Bean 依賴必須通過 ref 元素定義。

ByName自動裝配

Java程式碼

public class User {
	private String name;
	public User(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void
setName(String name) { this.name = name; } @Override public String toString() { return "User name=" + name ; } } public class UserDaoImpl implements UserDao{ @Override public User getUser() { return new User("自動裝配ByName"); } } public class UserServiceImpl implements
UserService{ private UserDao userDao; public UserDao getUserDao() { return userDao; } public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Override public User getUser() { return userDao.getUser(); } } public class TestSpringAutowire { public static void main(String[] args) { ApplicationContext act= new ClassPathXmlApplicationContext("/config/spring.xml"); UserServiceImpl userService=(UserServiceImpl)act.getBean("userService"); User user = userService.getUser(); System.out.println(user.getName()); } }

xml

<?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:p="http://www.springframework.org/schema/p"
	xmlns:c="http://www.springframework.org/schema/c"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
	<bean id ="userDao" class="cn.lingyiwin.dao.impl.UserDaoImpl"/>
	<bean id ="userService" class="cn.lingyiwin.service.impl.UserServiceImpl" autowire="byName"/>
</beans>

<!--或-->

<?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:p="http://www.springframework.org/schema/p"
	xmlns:c="http://www.springframework.org/schema/c"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byName">
	<bean id ="userDao" class="cn.lingyiwin.dao.impl.UserDaoImpl"/>
	<bean id ="userService" class="cn.lingyiwin.service.impl.UserServiceImpl"/>
</beans>

執行結果:
在這裡插入圖片描述
注意:ByName自動裝配 service 中的userDao 是通過set方法設定的,xml中userDao要和sevice中屬性名稱一樣。

ByType自動裝配(一般不用)

<?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:p="http://www.springframework.org/schema/p"
	xmlns:c="http://www.springframework.org/schema/c"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
        
	<bean class="cn.lingyiwin.dao.impl.UserDaoImpl"/>
	<bean id ="userService" class="cn.lingyiwin.service.impl.UserServiceImpl" autowire="byType"/>
</beans>

注意:通過型別裝配,需要確保型別只有一個,如果有多個型別,就報錯了,舉例如下:

UserDao增加一個實現類:

public class UserDaoMySqlImpl implements UserDao{
	@Override
	public User getUser() {
		return null;
	}
}

xml注入

<?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:p="http://www.springframework.org/schema/p"
	xmlns:c="http://www.springframework.org/schema/c"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
        
	<bean class="cn.lingyiwin.dao.impl.UserDaoImpl"/>
	<bean class="cn.lingyiwin.dao.impl.UserDaoMySqlImpl"/>
	<bean id ="userService" class="cn.lingyiwin.service.impl.UserServiceImpl" autowire="byType"/>
</beans>

執行結果:

警告: Exception encountered during context initialization - cancelling refresh attempt
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userService' defined in class path resource [config/spring.xml]: Unsatisfied dependency expressed through bean property 'userDao': : No qualifying bean of type [cn.lingyiwin.dao.UserDao] is defined: expected single matching bean but found 2: cn.lingyiwin.dao.impl.UserDaoImpl#0,cn.lingyiwin.dao.impl.UserDaoMySqlImpl#0; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [cn.lingyiwin.dao.UserDao] is defined: expected single matching bean but found 2: cn.lingyiwin.dao.impl.UserDaoImpl#0,cn.lingyiwin.dao.impl.UserDaoMySqlImpl#0
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1303)

constructor 裝配

修改java程式碼:

public class UserServiceImpl implements UserService{
	private UserDao userDao;
	public UserServiceImpl(UserDao userDao) {
		this.userDao = userDao;
	}
	@Override
	public User getUser() {
		return userDao.getUser();
	}
}

xml:

<?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:p="http://www.springframework.org/schema/p"
	xmlns:c="http://www.springframework.org/schema/c"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
        
	<bean class="cn.lingyiwin.dao.impl.UserDaoImpl"/>
	<bean id ="userService" class="cn.lingyiwin.service.impl.UserServiceImpl" autowire="constructor"/>
</beans>

執行結果:
在這裡插入圖片描述