spring bean约束与bean标签详解
Spring bean 约束 与标签详解:
约束头:
<?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"> </beans>
标签说明:
improt 标签:
用于引入其他的spring.xml文件;
目的:
当在一个大型的项目或有很多需要配置的相关信息,可以分离功能到不同的spring.xml文件中,并在一个总的入口文件中引入,以便清晰配置文件的结构,和后期对配置文件的维护工作;
import属性:
Resource : 被添加spring配置文件的路径,默认从当前文件路径下查找
Ex:
<import resource="springaop.xml"/>
Bean 标签:
声明一个bean对象,并将该对象添加到应用上下文中;
目的:
初始化对象,并将对象保存在spring上下文中,并在用户需要时,将对象交给用户使用;这也是IOC控制反转的核心;
bea属性:
Id: 声明bean的id,该id在整个配置文件中唯一;
Name :声明bean的名称,在整个配置文件中该name值唯一;该值可用于依赖注入和自动装配时使用;
Class :声明该bean的class对象类型,输入值为类的完整名称;
Ex:
<bean name=”persion” class=”spring.demo.Persion” > </bean>
bean属性:
Factory-bean : 声明一个工厂对象,当需要使用该工厂类来生产对应的对象时,可以在其他的bean标签中引用该工厂对象来生产对象;
Factory-method :工厂对象的工厂方法,用于生产特定的对象;
Ex:
使用工厂bean创建对象的2中方法:
有工厂代码如是:
1 package spring.core.demo; 2 3 public class PersionFactory { 4 5 static public IPersion getPersion(String type) { 6 7 if("student".equals(type)) 8 9 return new Student(); 10 11 return null; 12 13 } 14 15 public IPersion getP(String type) { 16 17 if("student".equals(type)) 18 19 return new Student(); 20 21 return null; 22 23 } 24 25 }
1, 使用static 静态方法创建,spring.xml配置文件如下:
<bean name="student" class="spring.core.demo.PersionFactory" factory-method="getPersion"> <!— 该方法需要传入参数,使用constructor-arg标签传入,该标签后续将到 --> <constructor-arg index="0" value="student"></constructor-arg> </bean>
2, 使用实例化工厂对象创建:
先创建工厂:
<bean name="pf" class="spring.core.demo.PersionFactory"></bean>
再引用工厂,并创建特定的对象:
<bean name="stu1" factory-bean="pf" factory-method="getP" > <constructor-arg index="0" value="student"></constructor-arg> </bean>
bean属性:
Abstract : 声明该bean是否为一个抽象(类本身可以不是抽象类),spring将不对该对象进行实例化;可将该bean做为其他bena的parent属性引用,则其他bean将继承该抽象类的属性和方法;
Parent :声明该bean的父类的引用,并创建父类类型的实例化对象;
个人理解: abstract 和parent标签没有功能性的作用,猜测其设计目的是:当存在很多相同对象的创建时,使用parent引用一个相同的abstract,可以简化class属性权限定名称的输入;
Ex:
<bean name=”absP” class=”spring.core.demo.name.is.long.Persion” abstract=”true”></bean> <bean name=”p1” parent =”absP”></bean>
Bean属性:
Autowite : 设置是否对该bena的属性进行自动装载,以及装载的方式;
参数类型:
No:不自动装载
Default : 同上;
ByName:根据该bean的属性名称,查找与之匹配的bean,并注入;
ByType:根据该bean属性的class类型,查找与之匹配的bean,并注入;
Constructor :根据该bean的构造方法进行注入,使用此种模式,spring将从bean构造方法参数最多 向无参构造依次匹配;
Ex:
实例代码,有些凌乱,用于测试,看看就好,别较真:
package spring.core.demo; public class Student implements IPersion { public Student(Meat meat) { this.meat = meat; } public Student(Meat meat ,int a) { this.meat = meat; this.i = a; } public Student() {} private Meat meat; private Integer i; public Integer getI() { return i; } public void setI(Integer i) { this.i = i; } public void eat(String foot) { System.out.println("student eat " + meat.toString() + " i="+i); } public Meat getMeat() { return meat; } public void setMeat(Meat meat) { this.meat = meat; } }
Spring.xml 配置:
<bean name="stu3" class="spring.core.demo.Student" autowire="constructor" ></bean> <bean name="meat" class="spring.core.demo.Meat"></bean> <bean name="i" class="java.lang.Integer"> <constructor-arg><value>1</value></constructor-arg> </bean>
Bean 属性:
Lazy-init :声明该bean是否惰性加载,可选参数true,惰性加载,即在用于使用该bean是才实例化该bean;false,反之,在spring容器启动时就加载,default同false;
Depends-on:声明该bean所依赖的bean,则被依赖的bean将在该bean之前被实例化;
Init-method : 声明该bean的初始化方法,该方法将在bean实例化后立刻执行;
Destroy-method :声明该bean的销毁方法,该方法将在spring 的BeanFactory关闭时调用;
Bean属性:
Scope :声明bean的作用范围;
可选参数:
1, singleton : 单例,由spring保证该bean在整个spring容器中只存在一个对象实例;与单例模式不同;
2, prototype: 原型模式,每次使用都将创建一个新的对象;
3, request : 在一次http请求中只存在一份对象实例,此模式只在web应用中有效;
4, session :在一次session会话中有效;
5, global session :global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。
请注意,假如你在编写一个标准的基于Servlet的web应用,并且定义了一个或多个具有global session作用域的bean,系统会使用标准的HTTP Session作用域,并且不会引起任何错误。
Bean 子标签:
lookup-method :向给定的方法注入指定的bean;可用于:一个单例模式的类需要获取相同类的不同实例;
Ex:
有测试代码如下:
package spring.core.demo; public abstract class AbstarctPersion { abstract public IPersion getPersion(); public void printPersion() { System.out.println(getPersion().hashCode()); } } package spring.core.demo; public calss IPersion { }
spring.xml配置文件如下:
<bean id="stu" parent="spring.core.demo.IPersion" scope="prototype"></bean> <bean id="absStu" class="spring.core.demo.AbstarctPersion"> <lookup-method name="getPersion" bean="stu"/> </bean>
获取的bean需要设置其范围模式,如果模式为default,则每一次获取的对象都是同一个对象;如果需要获取不同的对象,则设置为prototype原型模式;
Bean 子标签:
replaced-method :方法替换;
属性:
Name :该bean需要被替换的方法名称;
Bean :用来替换该方法的bean引用;被引用bean说明:该bean需要实现spring所提供接口MethodReplacer,其具体执行内容放置在reimplement方法中;
EX:
实现了MethodReplacer接口的类
package spring.core.demo; import java.lang.reflect.Method; import org.springframework.beans.factory.support.MethodReplacer; public class MethodReplacerTest implements MethodReplacer { public Object reimplement(Object obj, Method method, Object[] args) throws Throwable { System.out.println("0000000000000000"); return null; } }
预期将被替换方法的类
package spring.core.demo; public class Meat { public void getI() { } }
Spring.xml 配置文件
<bean id="mrt" class="spring.core.demo.MethodReplacerTest"></bean> <bean name="meat" class="spring.core.demo.Meat"> <replaced-method name="getI" replacer="mrt"></replaced-method> </bean>
Bean子标签:
Constructor-arg : 构造函数参数;当bean使用该标签后,spring将匹配与参数相对应的构造函数,并实例化对象;
属性:
Index : 参数下标,从0开始;
Name :参数名,匹配构造方法中与之匹配的参数名,并注入;
Type:参数的类型,如果构造方法中存在多个相同的类型,则从左向右依次注入;
Ref:注入值,引用当前spring上下文中存在的bean的id或name;
Value:注入值;与ref不可并存;
Property : 为该bean所给定的属性注入值;
属性:
Name:该bean需要被注入值的属性名称;
Ref:注入值,引用当前spring上下文中存在的bean的id或name;
Value: 注入值,与ref不可并存;
Bean子标签之赋值标签:
Value:设置值;
Array:数组标签;
Map:map标签
List:list标签
Set:set标签
共有属性: value-type:设置传入值的类型;
Alias 标签:
别名标签,为bean设置别名;
属性:
Name:需要被设置别名的bean的引用;
Alias:别名;
Description 标签:
描述标签,该标签当做子标签用于其他的标签之中,如bean;表示对bean的描述;