Spring bean定义和属性赋值
Spring Bean
由 Spring IoC 容器管理的对象称为 Bean,Bean 根据 Spring 配置文件中的信息创建
可以把 Spring IoC 容器看作是一个大工厂,Bean 相当于工厂的产品。如果希望这个大工厂生产和管理 Bean,就需要告诉容器需要哪些 Bean,以哪种方式装配。
Spring 配置文件支持两种格式,即 XML 文件格式和 Properties 文件格式。
Properties 配置文件主要以 key-value 键值对的形式存在,只能赋值,不能进行其他操作,适用于简单的属性配置。
XML 配置文件采用树形结构,结构清晰,相较于 Properties 文件更加灵活。但是 XML 配置比较繁琐,适用于大型的复杂的项目。
通常情况下,Spring 的配置文件都是使用 XML 格式的。XML 配置文件的根元素是 ,该元素包含了多个子元素 。每一个 元素都定义了一个 Bean,并描述了该 Bean 是如何被装配到 Spring 容器中的。
一个简单的Spring bean
实体类 User
这就是一个简单的实体类
public class User {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
spring.xml中注册User这个bean,交给spring管理
在spring的xml配置文件中定义 bean ,将 User 类的全类写上,这样spring工厂,就能利用反射机制进行对象的创建,然后又配置了属性name,以及值value,前提是 User 类中对这些字段提供了相应的setter方法,便于spring利用反射机制调用setter方法,完成依赖的注入,perfect
<!-- User -->
<bean class="com.liu.c.User" id="user">
<property name="age" value="18"/>
<property name="name" value="小刘"/>
</bean>
- 1
- 2
- 3
- 4
- 5
测试
创建启动工厂,获取 user 对象,并打印
public class TestUser {
public static void main(String[] args) {
String springProperties = "spring.xml";
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(springProperties);
User user = context.getBean("user", User.class);
System.out.println(user);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
结果
因为spring工厂默认是单例模式,单例在工厂创建时就会实例化对象,并将配置的依赖关系利用 Java 的反射机制进行依赖注入,所以我们看到,在打印 user 时默认调用了重写的 toString 方法,并且成功为属性赋值了
User{age=18, name='小刘'}
- 1
当然如果想要spring工厂创建多例的对象,只需要在相应的bean配置中加入scope属性
,配置scope="prototype"
即可实现多例,默认是 singleton
意思是单个实例
<!-- User -->
<bean class="com.liu.c.User" id="user" scope="prototype">
<property name="age" value="18"/>
<property name="name" value="小刘"/>
</bean>
- 1
- 2
- 3
- 4
- 5
public class TestUser {
public static void main(String[] args) {
String springProperties = "spring.xml";
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(springProperties);
User user = context.getBean("user", User.class);
User user1 = context.getBean("user", User.class);
System.out.println(user.hashCode());
System.out.println(user1.hashCode());
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
你说对吧,佩奇
33317023
13818597
- 1
- 2
Spring Bean属性注入的两种方式
Spring 主要使用两种方式来对属性进行注入
- setter注入(important)
- 构造注入 (了解知道)
setter 注入
在 Spring 实例化 Bean 的过程中,IoC 容器首先会调用默认的构造方法(无参构造方法)实例化 Bean(Java 对象),然后通过 Java 的反射机制调用这个 Bean 的 setXxx() 方法,将属性值注入到 Bean 中
步骤:
在 Bean 中提供一个默认的无参构造函数,因为如果没有无参构造,spring就无法通过无参构造的方式创建对象,更别提通过反射获取对象里的setter方法,进行赋值了(没有其他带参构造函数的情况下,可省略,默认是有无参构造的),并为所有需要注入的属性提供一个 setXxx() 方法
在 Spring 的 XML 配置文件中,使用 <beans>
及其子元素 <bean>
对 Bean 进行定义
在 <bean>
元素内使用 <property>
元素对各个属性进行赋值。
具体代码上面的那个User就是通过setter进行赋值的,这里就不冗余再写一遍了,对于其他类型的注入,将会在下一篇文章写,需要的小伙伴可以关注我哦,可以一起交流呀!下面就说一说使用构造函数的方法进行注入
构造函数注入
我们可以通过 Bean 的带参构造函数,以实现 Bean 的属性注入。
步骤
在 Bean 中添加一个有参构造函数,构造函数内的每一个参数代表一个需要注入的属性;
在 Spring 的 XML 配置文件中,通过 <beans>
及其子元素 <bean>
对 Bean 进行定义;
在 <bean>
元素内使用 <constructor-arg>
元素,对构造函数内的属性进行赋值,Bean 的构造函数内有多少参数,就需要使用多少个 <constructor-arg>
元素。
对User进行改造
User
提供一个有参构造,这时默认的无参构造就会被覆盖,因此可以把无参构造再次定义一次
public class User {
private Integer age;
private String name;
public User() {
}
public User(Integer age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
spring.xml使用构造方式进行赋值
<!-- User -->
<bean class="com.liu.c.User" id="user" scope="prototype">
<constructor-arg name="age" value="15"/>
<constructor-arg name="name" value="小张"/>
<!--这里也可以使用index,就是说构造方法的参数,注意是从0开始的哦,那这里的0就表示user构造函数的
第一个参数age,以此类推,但不建议这样使用,因为可读性变差了,养成好习惯,关注代码的可维护-->
<!-- <constructor-arg index="0" value="15"/>-->
<!-- <constructor-arg index="1" value="小张"/>-->
</bean>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
结果
成功赋值了,为什么说不推荐呢,举个例子,比如现在这个类的属性有很多,然后你就需要重写很多构造方法,会显得十分的臃肿和麻烦
User{age=15, name='小张'}
- 1
好了,这就是今天的全部内容了,明天分享一下对于其他类型的注入,比如数组,集合类型的注入方法,也很简单,注入学习完了之后,就学习一下bean的作用域和生命周期,OK,拜拜了ヾ(•ω•`)o
文章来源: blog.csdn.net,作者:周棋洛ყ ᥱ ᥉,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/m0_53321320/article/details/123555506
- 点赞
- 收藏
- 关注作者
评论(0)