欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

spring bean约束与bean标签详解

程序员文章站 2022-05-20 12:14:34
Spring bean 约束 与标签详解: 约束头: 标签说明: improt 标签: 用于引入其他的spring.xml文件; 目的: 当在一个大型的项目或有很多需要配置的相关信息,可以分离功能到不同的spring.xml文件中,并在一个总的入口文件中引入,以便清晰配置文件的结构,和后期对配置文件 ......

 

 

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