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的描述;

猜你喜欢

转载自www.cnblogs.com/loveyoumi/p/9294401.html
今日推荐