07_Spring Bean 自動裝配 byName byType constructor autodetect no <bean> 元素的 autowire 屬性
阿新 • • 發佈:2020-12-30
技術標籤: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>
執行結果: