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"));
}
}
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());
}
}