Spring中对Bean的理解
什么是Bean
1、在我们的Java中是一种面向对象的语言,而对象由属性和行为组成,我们只有通过实例化对象才能操作该对象的属性和行为
2、只要是我们带有属性和成员的类都要到Spring IOC容器中进行实例化
3、我们Spring IOC容器对Bean的处理是通过工厂模式于反射的结合
Bean的装配
Bean装配方式采用自动装配,是通过在Spring 配置文件得beans标签中引导项得default-autowire属性来设定,该属性对应属性值得含义如下表格
开启自动装配default-autowire属性值描述
属性值 | 作用描述 |
---|---|
byName | 根据我们得bean节点给定的id值与纯净类中属性名称进行匹配来自动注入 |
byType | 根据bean节点class属性值与纯净类中成员属性类型进行匹配来自动注入 |
constructor | 与byType类似,此处是根据构造方法来注入(底层还是采用byType方式) |
no | 默认值,不开启Bean实例得自动装配模式 |
三种方式案例
纯净类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
private String name;
private String pwd;
private Dog dog;
public User(Dog dog) {
this.dog = dog;
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dog {
private String name;
}
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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byName">
<!--Bean的自动装配方式一:byName-->
<bean id="user" class="com.spring.pojo.User" scope="singleton">
<property name="id" value="1"/>
<property name="name" value="王麻子"/>
<property name="pwd" value="123456"/>
</bean>
<!--狗:注意此处得id值与User类中的属性名称保持一致-->
<bean id="dog" class="com.spring.pojo.Dog">
<property name="name" value="拉布拉多"/>
</bean>
</beans>
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.xsd" default-autowire="byType">
<!--Bean的自动装配方式二:byType-->
<bean id="user" class="com.spring.pojo.User" scope="singleton">
<property name="id" value="2"/>
<property name="name" value="王翠花"/>
<property name="pwd" value="234567"/>
</bean>
<!--狗:注意此处class属性值与User类中的属性类型保持一致,id值可随意设定-->
<bean id="dog1" class="com.spring.pojo.Dog">
<property name="name" value="大金毛"/>
</bean>
</beans>
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.xsd" default-autowire="byType">
<!--Bean的自动装配方式二:byType-->
<bean id="user" class="com.spring.pojo.User" scope="singleton">
<property name="id" value="3"/>
<property name="name" value="王大锤"/>
<property name="pwd" value="456789"/>
</bean>
<!--狗:注意此处class属性值与User类中的属性类型保持一致,id值可随意设定,且User类中必须给定对应得构造方法,否则报错-->
<bean id="dog1" class="com.spring.pojo.Dog">
<property name="name" value="二哈"/>
</bean>
</beans>
三种方式得单元测试
//Bean自动装配方式测试
@Test
public void demoBean(){
//构建Spring IOC容器实例
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//自动装配:byName
//User beanByName = applicationContext.getBean("user", User.class);
//System.out.println("byName方式:" + beanByName);
//自动装配:byType
//User beanByType = applicationContext.getBean("user", User.class);
//System.out.println("byType方式:" + beanByType);
//自动装配:constructor
User beanConstructor = applicationContext.getBean("user", User.class);
System.out.println("constructor方式:" + beanConstructor);
}
三种装配方式注意点
- 通过byName方式进行自动装配时,我们的bean节点得id属性值在纯净类中需要有一个属性名称能与之对应,否则无法进行注入
- 通过byType方式进行自动装配时,bean节点class属性值是全限定类名要与纯净类中的一个属性名称得类型进行匹配,否则无法注入
- 通过constructor方式进行自动装配时,有两个条件:①bean节点得class属性值要与纯净类中的属性类型进行对应(底层蚕蛹byType方式) ②需要装配得纯金类中必须存在相应得构造方法
感谢大家的阅读,热爱分享的仓鼠,请大家多多指教,么么哒~~~~