Spring-Bean配置(上)


Bean配置项(位于xml文件bean标签下)

id:在IOC容器中bean的标识,不可重复且唯一,一般为类名首字母小写

class:类名,如果为面向接口编程注意不是接口名

scope:作用域,指在同一个IOC容器中

singleton(默认模式):单例,指每一个bean容器中只存在一份,Base类中context,上下文

prototype:每次向IOC容器请求,都会重新创建新的实例,destory方法不生效

request:每次http请求创建一个实例且仅在当前的request内有效

session:同上,只在seesin有效

global session:基于portlet的web中有效,如果在web中,同session


Constructor arguments :构造器参数
Properties:属性





bean生命周期

定义-初始化-使用-销毁

定义:在xml文件中定义


初始化:context初始化bean对象


方法一:配置文件中配置初始化和销毁方法;与xml文件中bean属性对应 init-method,destory-method
方法二:实现接口的初始化和销毁方法;实现接口 InitializingBean,DisposableBean
方法三:默认全局的初始化和销毁方法;在xml文件中beans属性对应 default-init-method default-destory-method


注意:若三种方法同时存在,只执行方法1,2,并且先执行2


使用:在单元测试中 或者实际开发应用中使用实例对象


销毁:bean容器停止时销毁





Aware接口

Spring中提供里一些以Aware结尾的接口

实现了Aware接口的bean在被初始化以后,可以获取相应的资源
通过Aware接口,可以对Spring相应的资源进行操作,但是需要慎重,因为你的操作可能会对IOC容器造成破坏
但这种接口对Spring进行简单的扩展提供了方便的入口

ApplicationContextAware
BeanNameAware


代码示例:

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class MyApplicationContext implements ApplicationContextAware{

	private ApplicationContext applicationContext;
	
	@Override
	public void setApplicationContext(ApplicationContext arg0)
			throws BeansException {
		//这里面传入的是加载了 MyApplicationContext bean的IOC容器的上下文信息
		this.applicationContext=applicationContext;
		System.out.println("MyApplicationContext"+arg0.getBean("myApplicationContext"));
		
	}
	
	public void test(){
		//可得到相应的信息applicationContext.get.....;
	}

}


import org.springframework.beans.factory.BeanNameAware;

public class MyBeanName implements BeanNameAware{

	@Override
	public void setBeanName(String arg0) {
		// TODO Auto-generated method stub
		System.out.println("MyBeanName"+arg0);
	}

}


<?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" >
        
	<bean id="myApplicationContext" class="test5.MyApplicationContext"></bean>
	<bean id="myBeanName" class="test5.MyBeanName"></bean>

</beans>



import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;
import test.UnitTestBase;

@RunWith(BlockJUnit4ClassRunner.class)
public class TestAware extends UnitTestBase{
	public TestAware(){
		super("classpath*:spring-aware.xml");
	}
	
//	@Test
//	public void testApplication(){
//		System.out.println("testApplication"+super.getBean("myApplicationContext"));
//	}
	
	
	@Test
	public void testName(){
		System.out.println("testName"+super.getBean("myBeanName"));
	}
}






Autowiring-bean的自动装配(不需要依赖注入


no:不做任何操作

byName:查找IOC容器的所有内容,根据名字查找属性完全一致的bean,进行匹配

byType:若存在一个与指定属性类型相同的bean,bean id不同也没关系,class相同即可,自动装配
  若存在多个,抛出异常
没有,什么事都不发生

以上两种方法都需要使用set方法,注意如果此时类中包括了构造器,则会报错


constructor:若容器中没有找到与构造器参数类型一致的bean,抛出异常
注意这个构造方法是加在,你需要使用其他类的对象的那个类中去的
并且不会再使用set方法


用byName的时候,bean id=“xxx”一定要与setXxx(形参)的Xxx首字母变小写后相同,而不一定与形参相同,也不一定与成员变量相同。一般正规的set方法后面的Xxx是与成员变量相同的,因此一般情况下bean id与成员变量相同。


代码示例:

public class AutoWiringService {
	private AutoWiringDAO autoWiringDAO;
	
//	public AutoWiringService(AutoWiringDAO autoWiringDAO) {
//		super();
//		System.out.println("constructor");
//		this.autoWiringDAO = autoWiringDAO;
//	}
	
	public void setAutoWiringDAO(AutoWiringDAO autoWiringDAO) {
		System.out.println("setAutoWiringDAO");
		this.autoWiringDAO = autoWiringDAO;
	}
	
	public void say(String word){
		this.autoWiringDAO.say(word);
	}
}


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



<?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 id="autoWiringDAO" class="test6.AutoWiringDAO"></bean>
	<bean id="autoWiringService" class="test6.AutoWiringService"></bean>
</beans>



import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;
import test.UnitTestBase;

@RunWith(BlockJUnit4ClassRunner.class)
public class TestAutoWiring extends UnitTestBase{
	public TestAutoWiring(){
		super("classpath*:spring-autowiring.xml");
	}
	
	@Test
	public void test(){
		AutoWiringService service=super.getBean("autoWiringService");
		service.say("ohno");
	}
}


在Service类中,有DAO类型的成员变量,当test方法运行时,按照bean配置自动注入方式为byType

会在IOC容器中寻找类型为DAO的对象,不需要添加set方法或者构造器方法







Resources

针对资源文件的统一接口







代码示例:

import java.io.IOException;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.io.Resource;


public class MyResource implements ApplicationContextAware{

	private ApplicationContext applicationContext;
	
	@Override
	public void setApplicationContext(ApplicationContext arg0)
			throws BeansException {
		
		this.applicationContext=arg0;
	}
	
	public void resource() throws IOException{
		//Resource resource=applicationContext.getResource("classpath:config.txt");
		//Resource resource=applicationContext.getResource("url:http://...");
		Resource resource=applicationContext.getResource("file:D:\\Myeclipse\\Workspace\\SpringCourse\\src\\config.txt");
		
		System.out.println(resource.getFilename());
		System.out.println(resource.contentLength());
	}	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值