spring中Bean的装配⽅式及bean的⽣命周期(⼆)Spring中Bean的配置⽅式:注解配置,xml配置,基于java的配置
1.注解配置(⾃动化装配bean)
Spring从两个⾓度来实现⾃动化装配:
1.1 组件扫描(component scanning):Spring会⾃动发现应⽤上下⽂中所创建的bean。
使⽤@Component注解表明该类会作为组件类,并告知Spring要为这个类创建bean。使⽤时记得启⽤组件扫描,⽅法有两种:  ⽅法⼀:创建配置类,通过ComponentScan启⽤组件扫描
⽅法⼆:通过xml⽂件配置启⽤组件扫描<context:component-scan base-package="被扫描的组件"/>
1.2 ⾃动装配(autowiring):Spring⾃动满⾜bean之间的依赖。
我们将bean⾃动添加到Spring容器中,只需⽤注解⾃动装配来满⾜bean之间的依赖关系。 如:@Autowired
2.基于java的配置
先介绍这个,最后着重介绍基于xml配置。、
其实在SpringBoot中就采⽤了Java类的配置⽅式。Java类的配置⽅式就是声明⼀个Java类来配置bean。
创建配置类,@Configuration注解表明这个类是⼀个注解类,该类包含了在Spring应⽤上下⽂中如何创建bean的细节。
简单的⽰例:
@Configuration
public class SpringBeanConfig{
/**
*配置bean时,在该⽅法上使⽤@Bean注解,可以⾃动注⼊到spring容器中
*相当于xml中的<bean>标签
*/
@Bean
public EmployeeDao getEmployeeDao(){
return new EmployeeDao();
}
}
基于xml的配置⽅式,我们需要借助于<bean>标签。
<bean id="唯⼀标识" name="别名" class="类的全路径" ></bean>
此时若要注⼊bean,⽅法有两种:
⽅法⼀:构造注⼊
<bean id="唯⼀标识" name="别名" class="类的全路径" >
<constructor-arg ref="注⼊的bean的标识"/>
</bean>
⽅法三:属性注⼊
<bean id="唯⼀标识" name="别名" class="类的全路径" >
<property name="属性名" ref="属性名所对应的对象的标识"/> </bean>
实例化Bean的三种⽅式
1.1 使⽤构造⽅法
1.2 使⽤静态⼯⼚⽅法【(直接创建)】
1.3 使⽤实例⼯⼚⽅法【(需要先创建⼯⼚,在创建实体)】简单的⽰例:
要创建的对象:
public class Employee {
spring ioc注解
private Integer emp_id;
private String name;
private String phone;
private String email;
public Integer getEmp_id() {
return emp_id;
}
public void setEmp_id(Integer emp_id) {  p_id = emp_id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
}
}
静态⼯⼚
package com.dsx.spring_bean;
/**
* @ClassName: StaticFactory
* @Description: 模拟静态⼯⼚
* @author ⽈业⽽安
*/
public class StaticFactory {
public static Employee getEmp() {
return new Employee();
}
}
实例⼯⼚
/**
* @ClassName: StaticFactory
* @Description: 模拟实例⼯⼚
* @author ⽈业⽽安
*/
public class InstanceFactory {
public Employee getEmp() {
return new Employee();
}
}
配置⽂件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="/2001/XMLSchema-instance"
xmlns="/schema/beans"
xmlns:p="/schema/p"
xsi:schemaLocation="/schema/beans
/schema/beans/spring-beans-4.2.xsd ">
<!--
第⼀种⽅式:使⽤默认构造函数创建
在spring的配置⽂件中使⽤bean标签,配以id和class属性之后,且没有其他属性和标签时
采⽤的就是默认构造函数创建bean对象,此时如果类中没有默认构造函数,则对象⽆法创建
-->
<bean id="employee_constructor" class="com.dsx.spring_bean.Employee">
<property name="phone" value="131********"></property>
</bean>
<!--
第⼆种⽅式:使⽤普通⼯⼚中的⽅法创建对象(使⽤某个类中的⽅法创建对象,并存⼊spring容器)
-->
<bean id="instanceFactory" class="com.dsx.spring_bean.InstanceFactory"></bean>
<bean id="employee_instanceFactory" factory-method="getEmp" factory-bean="instanceFactory"></bean>
<!--
第三种⽅式:使⽤⼯⼚中的静态⽅法创建对象(使⽤某个类中的静态⽅法创建对象,并存⼊spring容器)
-->
<bean id="employee_staticFactory" class="com.dsx.spring_bean.StaticFactory" factory-method="getEmp"></bean> <!--
bean的作⽤范围调整
bean标签的scope属性:
作⽤:⽤于指定bean的作⽤范围
取值:常⽤的就是单例的和多例的
singleton:单例的(默认值)
prototype:多例的
request:作⽤于web应⽤的请求范围
session:作⽤于web应⽤的会话范围
global-session:作⽤于集环境的会话范围(全局会话范围),当不是集环境时,它就是session
-->
</bean>
此时bean就被实例化并注⼊到了spring容器中。注意要确保有⽆参构造⽅法。
静态⼯⼚,动态⼯⼚(实例⼯⼚)的介绍与区别
静态⼯⼚直接可以通过静态⽅法来实例化⼀个对象。
动态⼯⼚要先创建类对象,在通过⼯⼚对象来调⽤创建实例对象的⽅法。
区别:
静态⼯⼚初始化之前,⼯⼚中的类已经被实例化放在⼯⼚容器中
实例⼯⼚在构造⽅法初始化时,会将类进⾏实例化放在⼯⼚中。
bean属性注⼊的⼏种⽅式:
1. 使⽤构造函数注⼊(⼀般不⽤)
在bean标签内部使⽤的标签:<constructor-arg name="" ref="指定其引⽤的bean" .../>
标签中的属性:
type:⽤于指定要注⼊的数据的数据类型,该数据类型也是构造函数中某个或某些参数的类型
index:⽤于指定要注⼊的数据给构造函数中指定索引位置的参数赋值。索引的位置是从0开始
name(常⽤的):⽤于指定给构造函数中指定名称的参数赋值
=============以上三个⽤于指定给构造函数中哪个参数赋值============
value:⽤于提供基本类型和String类型的数据
ref:⽤于指定其他的bean类型数据,在spring的Ioc核⼼容器中出现过的bean对象
优势:
在获取bean对象时,注⼊数据是必须的操作,否则对象⽆法创建成功
弊端:
改变了bean对象的实例化⽅式,使我们在创建对象时,如果⽤不到这些数据,也必须提供
2. 使⽤set⽅法注⼊
bean标签内部使⽤标签:property
标签的属性
name:⽤于指定注⼊时所调⽤的set⽅法名称,去掉set之后⾸字母⼩写
value:⽤于提供基本类型和String类型的数据
ref:⽤于指定其他的bean类型数据。它指的就是在spring的Ioc核⼼容器中出现过的bean对象
优势:
创建对象时没有明确的限制,可以直接使⽤默认构造函数
弊端:
如果有某个成员必须有值,则获取对象时有可能set⽅法没有执⾏
3. p命名空间注⼊
注意:p名称空间注⼊,需要有⽆参构造⽅法
4. 使⽤注解注⼊
@Value、@Resource、@Qualifier
bean的作⽤域:
类别说明
singleton默认值,在Spring容器中仅存在⼀个Bean实例,Bean以单例模式存在
prototype每次从容器中调⽤Bean时,都返回⼀个新的实例。
request每次HTTP请求都会创建⼀个新的Bean,该作⽤域仅适⽤于WebApplicationContext环境
session同⼀个Http Session共享⼀个Bean,不同Session使⽤不同的Bean,仅适⽤于WebApplicationContext环境

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。