Spring对bean的管理细节

**

spring对bean的管理细节

1、创建bean的三种方式
2、bean对象的作用范围
3、bean对象的声明周期

创建对象的三种方式

1、使用默认构造函数创建
在spring配置文件中使用bean标签,配以id和class属性
使用的时默认构造函数,此时若对应类中没有默认构造函数,则对象无法创建

<bean id="accountService" class="com.zz.service.impl.AccountServiceImpl"></bean>

2、使用普通工厂中的方法创建对象(使用工厂类中的方法创建对象,并存入spring容器中)
首先创建factory包,并在包中创建InstanceFactory类,在此类中定义一个方法(任意,我使用的是getAccountService()方法),此方法返回类型是AccountService,在此方法中返回值是一个AccountService对象

<bean id="instanceFactory" class="com.zz.factory.InstanceFactory"></bean>
<bean id="accountService" fatory-bean="instanceFactory" factory-method="getAccountService"></bean>

3、使用工厂中的静态方法创建对象(使用工厂类中的静态方法创建对象,并存入spring容器中)
首先在factory包中创建一个StaticFactory类,在类中创建一个静态方法getAccountService() ,此方法返回值类型是AccountService,在此方法中返回值是一个AccountService对象

<bean id="accountService" class="com.zz.factory.StaticFactory" factory-method="getAccountService"></bean>

bean标签的scope属性
用于指定bean的作用范围的
取值;
singleton:单例的(默认的)
prototype:多例的
request:作用于web的请求范围
session:作用于web的会话范围
global-session:作用于群体环境的会话范围(全局会话范围),当不是群体环境时,他就是session

spring的依赖注入(Dependenty Injection)

**
IOC的作用:
降低程序间的耦合性(依赖关系)
依赖关系的管理:交给spring来维护
当前类用到的其他类中的对象,由spring提供,我们只需在配置文件中声明即可

依赖关系的维护称之为依赖注入
能注入的数据有三种:
基本类型和String
其他bean类型(在配置文件中或者注解过的bean)
复杂类型/集合类型
注入的三种方式:
构造函数提供
使用set方法提供
使用注解提供

1、构造函数注入
使用的标签:constructor-arg
标签出现的位置:bean标签的内部
标签中的属性:
type:用于指定要注入的数据的数据类型,该数据类型也是某个或某些参数的类型
index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值,索引的位置从0开始
name:用于指定给构造函数中指定名称的参数赋值
value:用于提供基本数据类型和String类型的数据
ref:用于指定其他bena类型的数据,他指的是spring的IOC核心容器中出现过的bean对象

优势:在获取bean对象时,注入数据是必须操作的,否则对象无法被创建
弊端:改变bean对象的实例方式,使我们在创建对象时,如果用不到这些数据,也必须提供

//type和value使用
<bean id="accountService" class="com.zz.service.impl.AccountServiceImpl">
	<constructor-arg type="java.lang.String" value="aaa"><constructor-arg>
</bean>

//name和value使用
<bean id="accountService" class="com.zz.service.impl.AccountServiceImpl">
	<constructor-arg name="name" value="aaa"></constructor-arg>
	<constructor-arg name="age" value="18"></constructor-arg>
	<constructor-arg name="birthday" ref="now"></constructor-arg>
</bean>
<bean name="now" class="java.util.Date"></bean>

2、set方法注入
涉及标签:property
出现的位置:bean标签内部
标签的属性:
name:用于指定注入时所调用的set方法名称
value:用于指定其他bean类型的数据。指的时spring的IOC核心类中出现过的bean对象
优势:创建对象时没有明确的限制,可以直接使用默认构造方法
弊端:如果某个成员必须有值,则set方法无法保证一定注入

<bean id="accountService" class="com.zz.service.impl.AccountServiceImpl">
	<property name="name" value="aaa"></property>
	<property name="age" value="21"></prioperty>
	<property name="birthday" ref="now"></property>
</bean>
<bean id="now" class="java.util.Date"></bean>

3、复杂类型的注入/集合类型的注入

public class AccountServiceImpl implements IAccountService {

    private String[] myStrs;
    private List<String> myList;
    private Set<String> mySet;
    private Map<String,String> myMap;
    private Properties myProps;

    public void setMyStrs(String[] myStrs) {
        this.myStrs = myStrs;
    }

    public void setMyList(List<String> myList) {
        this.myList = myList;
    }

    public void setMySet(Set<String> mySet) {
        this.mySet = mySet;
    }

    public void setMyMap(Map<String, String> myMap) {
        this.myMap = myMap;
    }

    public void setMyProps(Properties myProps) {
        this.myProps = myProps;
    }

    @Override
    public void saveAccount() {
        System.out.println(Arrays.toString(myStrs));
        System.out.println(myList);
        System.out.println(mySet);
        System.out.println(myMap);
        System.out.println(myProps);
    }
}

<bean id="accountService" class="com.qst.service.AccountServiceInpl">
	<property name="myStrs">
		<array>
			<value>AAA</value>
			<value>BBB</value>
		</array>
	</property>
	<property name="myList">
		<list>
			<value>AAA</value>
			<value>BBB</value>
		</list>
	</property>
	<property name="mySet">
		<set>
			<value>AAA</value>
			<value>BBB</value>
		</set>
	</property>
	<property name="myList">
		<list>
			<value>AAA</value>
			<value>BBB</value>
		</list>
	</property>
	<property>
		<map>
			<entry key="testC" value="CCC"></entry>
			<entry key="testD">
				<value>DDD<value>
			</entry>
		</map>
	</property>
	<property>
		<props>
			<prop key="testE">EEE</prop>
			<prop key="testF">FFF</prop>
		</props>
	</property>
</bean>

最后创建一个客户端类,用于检测

//通过反射使对象ac与bean.xml建立联系
ApplicationContext ac=new ClassPathXMLApplicationContext("bean.xml");
//通过ac的getBean()方法获取bean.xml文件中id为accountService的对象,并把对象赋给as
IAccountService ac=(IAccountService)as.getBean("accountService");
//调用as的saveAccount()方法
as.saveAccount();

注解:

注解使用前提:添加命名空间,让spring扫描含有注解的类

组件扫描:

<?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:context="http://www.springframework.org/schema/context"
    		 xsi:schemaLocation="http://www.springframework.org/schema/beans
        										https://www.springframework.org/schema/beans/spring-beans.xsd
        										http://www.springframework.org/schema/context
        										http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<!-组件扫描,扫描含有注解的类->
<context:component-scan base-package="com.zz.z_annotation"></context:component-scan>
</beans>

schema命名空间:
1、命名空间声明
默认:xmlns=""
显示:xmlns:别名=“名称”
2、确定schema文件位置
xsi:schemaLocation=“名称 位置”

注解相当于一个类,可以自己创建
开发中使用使用注解,取代xml配置文件

Componet:把当前对象存入到spring容器中
@Component取代
@Component(“id”)取代
web开发,提供3个@Component衍生注解,取代的仍然是,只有@Controller(“id”)才相当于
作用和属性和Componet是一模一样,是spring框架为我们明确提供三层使用
他们三个是spring框架为我们提供明确的三层使用的注解:
Controller:一般用在表现层
Service:一般用在服务层
Respository:一般用在持久层

依赖注入(可以给私有字段设置,也可以给setter方法设置):
	普通值:@Value("")
	引用值:
		方式1:按照**类型**注入@Autowired:
				相当于<bean id="A" class=""></bean>
							<bean id="B" class="">
									<property name="baoma">
										<ref bean="A"></ref>
									</property>
							</bean>
				自动按照类型注入,只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入
				如果IOC容器中没有任何bean类型和要注入的变量类型匹配,则报错
				出现位置:可以是方法上也可以是变量上
		方式2:按照**名称**注入:
				(1)、@Autowired
						@Quqalifier("名称"):(不能独立使用,要和Autowired配合)
						作用:在按照类注入的标准的基础上再按照名称注入,他在给类成员注入时不能单独使用,但是再给方法注入时可以
						如:	@Autowired
						@Quqalifier("accountDao")
				(2)、@Rresource("名称"):
						作用:直接按照bean的id注入,可以单独使用
						Resource(name="accountDao")

生命周期:
	初始化:@PostConstruct
	销毁:	  @PreDestroy
作用域:
	@Service("userServiceId")
	@Scope("prototype")多例
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值