3、spring入门—Spring Bean的装配(上)

Ioc容器的Bean配置项,从传统意义上来说只有class是必须的,其余的都可以不配置
Bean配置项
Id 唯一标识
Class 实例化的类 【必须的】
Scope 范围(作用域)
Constructor arguments 构造器参数
Properties 属性
Autowiring mode 自动装配模式
lazy-initialization mode 懒加载模式
Initialization/destruction method 初始化和销毁方法

Bean的作用域:

1.singleton:单例,指一个bean容器中只存在一份
2.prototype:每次请求(每次使用)都创建新的实例,destroy方式不生效
3.request:每次http请求创建一个实例且仅在当前request内有效
4.session:同上,每次http请求创建,当前session内有效

5.global session:基于portlet的web中有效(portlet定义了global session),如果是在web中,同session

global session:在一个公司的系统中有很多子系统,比如财务,人事。把这些系统常用功能模块集中一起,然后访问的时候可以点击进入不同的系统模块,这时访问不同系统但都是同一个session(即单点登录)

global session主要在portlet中使用,portlet主要用来做集成

相关代码:
@spring-beanscope.xml
<bean id="beanScope" class="BeanScope" scope="singleton"></bean>


@UnitTestBase.java
...省略


@BeanScope.java
public class BeanScope {
public void say(){
System.out.println("BeanScope say:"+this.hashCode());
}
}


@TestBeanScope.java
@RunWith(BlockJUnit4ClassRunner.class)
public class TestBeanScope extends UnitTestBase{
public TestBeanScope(){
super("classpath*:spring-beanscope.xml");
}

/**
 * scope="singleton"时,hashCode相同
 * scope="prototype"时,hashCode不同
 * 注意:如果写成两个方法,如果是@Test的两个方法,则无论是scope="任何",hashCode都不同,因为这是测试单元的问题(每调用一个测试单元,则重新部署@Before、@After);
 * 但如果是普通的两个方法,则hashCode是否相等取决于scope为什么模式。
 */
@Test
public void testSay1() {
BeanScope beanScope1 = super.getBean("beanScope");
beanScope1.say();
testSay2();
/*BeanScope beanScope2 = super.getBean("beanScope");
beanScope2.say();*/
}

public void testSay2() {
BeanScope beanScope3  = super.getBean("beanScope");
beanScope3.say();
}
}


生命周期:定义,初始化,使用,销毁
一.初始化:
方法1.实现org.springframework.beans.foctory.InitializingBean接口,覆盖afterPropertiesSet方法。系统会自动查找afterPropertiesSet方法,执行其中的初始化操作
方法2.配置init-method
例如设置bean中init-method="init"那么在初始化过程中就会调用相应class指定类的init()方法进行初始化工作


二 销毁(与初始化类似)
方法1.实现org.springframework.beans.foctory.DisposableBean接口,覆盖destory方法。
方法2.配置destory-method


三 配置全局初始化、销毁方法(属于默认配置,参考截图)
注意:
当三种方式同时使用时,全局(默认的)初始化销毁方法会被覆盖。
另外实现接口的初始化/销毁方式会先于配置文件中的初始化/销毁方式执行。
即使没有以上三种初始化方法也是可以编译执行的

注意事项
1.如果同时使用3种,default(第一种)不生效,优先级 接口>init-method(第二种>第三种)
2.如果default-init-method找不到对应的方法,不会报错,如果init-method找不到,则报错

Aware
.Spring中提供了一些以Aware结尾的接口,实现了Aware接口的bean在被初始化之后可以获取相应资源
.通过Aware接口,可以对Spring相应资源进行操作(一定要慎重)
.对为Spring进行简单的扩展提供了方便的入口

#spring——Aware接口#
作用:实现了Aware接口的bean在初始化后可以获取相应资源并进行相应的操作(对于操作的结果要慎重!)
举例:
ApplicationContextAware:向实现了该接口的bean提供IOC容器的上下文信息(ApplicationContext),实现了该接口的bean必须配置到配置文件中并由spring的bean容器加载
BeanNameAware:向实现了该接口的bean提供关于beanName定义的相关内容


启动容器,实例化ApplicationContext实例,然后加载配置文件,然后实例化配置文件中声明的bean。然后在实例bean的过程会先判断是否实现了这些Aware接口,如果实现了则会把相应的Aware资源注入。然后在相应的bean中就可以使用相应的Aware资源啦


梦编猿   相关代码——(上):
@spring-aware.xml
<bean id="moocApplicationContext" class="MoocApplicationContext"></bean>
<bean id="moocBeanName" class="MoocBeanName"></bean>


@TestAware.java
@RunWith(BlockJUnit4ClassRunner.class)
public class TestAware extends UnitTestBase{
public TestAware(){
super("classpath:spring-aware.xml");
}

/*@Test
public void testMoocApplicationContext(){
System.out.println("testMoocApplicationContext:"+super.getBean("moocApplicationContext").hashCode());
}*/

@Test
public void testMoocBeanName(){
System.out.println("testMoocBeanName:"+super.getBean("moocBeanName").hashCode());
}
}

相关代码——(下):
@MoocBeanName.java
public class MoocBeanName implements BeanNameAware,ApplicationContextAware{
private String beanname;
public void setBeanName(String name) {
this.beanname=name;
System.out.println("MoocBeanName:"+name);//输出:Bean配置的id名
}


public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
System.out.println("setApplicationContext:"+applicationContext.getBean(this.beanname).hashCode());
}
}


@MoocApplicationContext.java
public class MoocApplicationContext implements ApplicationContextAware{
// private ApplicationContext applicationContext;
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
// this.applicationContext=applicationContext;
// System.out.println("MoocApplicationContext:"+applicationContext.getBean("moocApplicationContext").hashCode());
}
}

spring 能自动装配bean与bean之间的依赖关系,无需使用ref显示的指定所依赖的bean,而是由spring容器检查xml配置文件内容,根据某种规则,为调用者bean注入依赖的bean。制动装配是通过<bean>元素的default-autowrite属性指定的,该属性只对只对该bean起作用,自动装配可以减少配置文件的工作量,但是降低了依赖关系的透明度

Bean 的自动装配(Autowiring)
default-autowire="no/byName/byType/constructor"
1.no:不做任何操作,Bean依赖必须通过使用ref元素定义。这是默认的配置
2.byName:根据属性 名 自动装配,设值注入
<bean id="xxx" class="xxx" ></bean>
3.byType:根据属性 类型 自动装配,相同类型多个会抛出异常,设值注入
<bean class="xxx" ></bean>
4.constructor:与 byType 方式类似,不同之处是构造注入,用于自动匹配构造器参数
<bean class="xxx" ></bean>


相关代码——(上):
@spring-autowiring.xml
<beans
...
default-autowire="constructor">
<bean id="autoWiringDAO" class="AutoWiringDAO"></bean>

<bean id="autoWiringService" class="AutoWiringService">
<!-- <property name="autoWiringDAO" ref="autoWiringDAO"></property> --><!-- 这里用default-autowire="byName"来实现 -->
</bean>
</beans>


@AutoWiringDAO.java
public class AutoWiringDAO {
public void say(String word){
System.out.println("AutoWiringDAO:"+word);
}
}


@TestAutoWiring.java
@RunWith(BlockJUnit4ClassRunner.class)
public class TestAutoWiring extends UnitTestBase{
public TestAutoWiring(){
super("classpath:spring-autowiring.xml");
}

@Test
public void testSay(){
AutoWiringService service=super.getBean("autoWiringService");
service.say("this is a test!");
}
}

相关代码——(下):
@AutoWiringService.java
public class AutoWiringService {
private AutoWiringDAO autoWiringDAO;
/**
* 1、setXxx中Xxx对应实现<property name="Xxx">(首字母大小写不计),并且对应default-autowire="byName"功能;
* 2、default-autowire="byType":根据属性 类型 自动装配,相同类型多个会抛出异常,设值注入;
* 注意1:byType与<bean>的DAO(即被ref)的id没有关联(即id没有也行);而byName与<bean>的DAO(即被ref)的id有关联,而且此id的规定与上述1的规定一样(但首字母计较大小写)。
* 注意2:constructor与 byType 方式类似[与<bean>的DAO(即被ref)的id没有关联(即id没有也行)],不同之处是构造注入。
*/
public void setAutoWiringDAO(AutoWiringDAO autoWiringDAO) {
this.autoWiringDAO = autoWiringDAO;
}


public AutoWiringService(AutoWiringDAO autoWiringDAO){
System.out.println("AutoWiringService");
this.autoWiringDAO=autoWiringDAO;
}

public void say(String word) {
this.autoWiringDAO.say(word);
}



Ps:默认:No,default-autowire="No"。

Spring -- Resources
(1)针对于资源文件的统一接口
(2)Resources
-- UrlResource :URL对应的资源,根据一个URL地址即可构建
-- ClassPathResource : 获取类路径下的资源文件
-- FileSystemResource : 获取文件系统里面的资源
-- ServletContextResource : ServletContext封装的资源,用于访问ServletContext环境下的资源
-- InputStreamResource : 针对于输入流封装的资源
-- ByteArrayResource : 针对于字节数组封装的资源

Resource:
通过实现 ApplicationContextAware获得ApplicationContext对象,
而ApplicationContext对象的getResource方法可以得到Resource对象,getResource(String)方法参数前缀如下:
(1)classpath:com/myapp/config.xml
从classpath加载
(2)file:/data/config.xml
从文件系统中通过URL加载
(3)http:/myserver/logo.png
从URL加载
(4)/data/config.xml
依赖于ApplicationContext

如何在spring中获得资源对象resource:
applicationContext都实现了ResourceLoader接口,可以通过他的方法getResource获得。
bean中如何获取applicationContext,通过实现对应的awaer接口获取。
获取resource的路径有4种,classpath,url,file,默认:
默认时时依赖applicationcontext的方式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值