spring—Bean配置

来源:互联网 发布:淘宝淡季是几月份 编辑:程序博客网 时间:2024/05/17 00:59

Spring是一个开源的框架,其目标是简化java的开发。为了降低Java开发的复杂性,Spring有如下的特性:

>> 基于POJO的轻量级和最小侵入性编程

>> 通过依赖注入和面向接口编程实现松耦合

>> 基于切面和惯例进行声明式编程

>> 通过切面和模板减少样板式代码

Spring的六大模块:核心Spring容器、SpringAOP模块、数据访问与集成、Web和远程调用以及测试模块


Spring中还有其他模块,例如Spring WebServiceSpring SecuritySpring Web FlowSpring .Net等等。Spring致力于简化企业级Java开发,促进代码松耦合,成功的关键在于依赖注入和AOP切面。依赖注入和AOPSpring中最核心的部分。

** 配置并使用第一个bean

准备一个Bean,在这个类中有nameage属性

publicclass Person {    private String name;    privateintage;       public Person() {}     public Person(String name, intage) {                                                                                                                                                                                       this.name = name;       this.age = age;    }     public String getName() {       returnname;    }     publicvoid setName(String name) {       this.name = name;    }     publicint getAge() {       returnage;    }     publicvoid setAge(intage) {       this.age = age;    }     @Override    public String toString() {       return"Person [name=" + name + ", age=" + age + "]";    }}
创建一个如下的beans.xml
xmlns全名是:xml Name Space[xml命名空间]在这个文件配置文件中如果你要加入其它的标签,在这个头部加入命名空间和对应的schema约束文件的地址即可。


Person类的Bean配置如下:

<bean id="person" class="com.wxh.blog.Person">       <property name="name" value="wxh"></property>                                                                                                                                                                <property name="age" value="22"></property>    </bean>
Bean中的id是唯一标识符,class是指向要配置bean的类全名。

在这个例子中用的是setter方法注入。Property中的name一定要和class中的属性的名字一样,才能正确匹配,value就是对应的值。
使用构造器注入

<bean id="person" class="com.wxh.blog.Person">       <constructor-arg name="name" value="wxh"></constructor-arg>                                                                                                                                          <constructor-arg name="age" value="22"></constructor-arg>    </bean>
<constructor-arg>还有index[代表匹配构造函数中第几个参数]type[代表value的类型]ref[代表对其他bean的引用]

使用bean

public static void main(String[] args) {       ApplicationContext ac=new ClassPathXmlApplicationContext("beans-example.xml");                                                                                                          Person person=(Person) ac.getBean("person");       System.out.println(person.toString());    }
ApplictionContext:应用上下文接口,派生与BeanFactoryBeanFactorySpring的核心但是功能比较单一。

ApplicationContext接口的实现类有三个:

>> ClassPathXmlApplicationContext: 从类路径下的XML配置文件中加载上下文定义。

>> FileSystemXmlApplicationContext: 读取文件系统下的XML配置文件并加载上下文定义。

>> XmlWebApplictionContext: 读取Web应用下的XML配置文件并装载上下文。[Web中使用]

** 引用其他bean和内部beanz注入

利用ref就可以实现引用其他的bean

首先添加一个Car

public class Car {    private String brand;    privateintprice;       public Car() {}     public Car(String brand, intprice) {                                                                                                                                                                                          this.price = price;       this.brand = brand;    }     public String getBrand() {       returnbrand;    }     publicvoid setBrand(String brand) {       this.brand = brand;    }       publicint getPrice() {       returnprice;    }     publicvoid setPrice(intprice) {       this.price = price;    }     @Override    public String toString() {       return"Car [brand=" + brand + ", price=" + price + "]";    }  }
配置CarBean

<bean id="car" class="com.wxh.blog.Car">       <constructor-arg value="吉利" ></constructor-arg>       <constructor-arg value="120000"></constructor-arg>                                                                                                                                                        </bean>

利用ref引用carbean

<bean id="person" class="com.wxh.blog.Person">       <constructor-arg name="name" value="wxh"></constructor-arg>                                                                                                                                         <constructor-arg name="age" value="22"></constructor-arg>       <constructor-arg name="car" ref="car"></constructor-arg>    </bean>
运行结果:Person [name=wxh, age=22, car=Car[brand=吉利, price=120000]]
内部Bean的使用如下:内部bean不能被其他bean使用所以用的不多。

<bean id="person" class="com.wxh.blog.Person">       <property name="name" value="wxh"></property>       <property name="age" value="22"></property>       <property name="car">           <bean class="com.wxh.blog.Car">              <property name="brand" value="吉利"></property>                                                                                                                                                              <property name="price" value="20000"></property>           </bean>       </property>    </bean>
** 利用p名称空间装配属性
先引入名称空间p,再使用
p:属性名=”” 或者 p:属性名-ref=””[引用]
    xmlns:p=http://www.springframework.org/schema/p                                                                                                                                                          <bean id="person" class="com.wxh.blog.Person"       p:name="wxh" p:age="22" p:car-ref="car"></bean>

** 集合的装配

先引入:xmlns:util="http://www.springframework.org/schema/util"

这里主要使用listmap、和props

>> list的使用

<util:list>       <bean class="com.wxh.blog.Car">           <property name="brand" value="奥迪"></property>           <property name="price" value="320000"></property>                                                                                                                                                     </bean>       <bean class="com.wxh.blog.Car">           <property name="brand" value="比亚迪"></property>           <property name="price" value="100000"></property>       </bean>       <bean class="com.wxh.blog.Car">           <property name="brand" value="吉利"></property>           <property name="price" value="120000"></property>       </bean>    </util:list>
>> map的使用
<util:map>       <entry key="favorite" value="篮球"></entry>       <entry key="motto" value="no pains, no gains"></entry>                                                                                                                                                 </util:map>
>> props的使用
<props>    <prop key="user">root</prop>    <prop key="password">root</prop>    <prop key="jdbcUrl">jdbc:mysql///test</prop>    <prop key="driverClass">com.mysql.jdbc.Driver</prop>                                                                                                                                                 </props>
最后说一下空值的装配,应该是这样的:<property name=”name”><null/></property>

** bean的作用域

所有的bean默认都是单例的,但是可以通过scope[作用域]来设置。

在单例模式中当xml配置文件被ApplicationContext加载后就会产生一个bean的实例,以后索取bean的实例,都是获取的同一个实例。可以把scope的值设置为prototype[原型],这个在文件被加载后就不会马上产生bean,每次取出一个bean的实例就创建一个新的。

在大多数情况下,我们只需要默认的singleton即可。

* bean的生命周期

Spring IOC容器对bean的生命周期的管理过程是:

>> 通过构造器或者工厂方法创建Bean实例

>> 设置Bean的属性

>> 调用Bean的初始化方法

>> 使用Bean

>> 关闭容器,调用Bean的销毁方法

如何使用init-methoddestroy-method?

先在class中添加一个initdestroy方法

publicvoid init(){       System.out.println("init......");    }       publicvoid destroy(){       System.out.println("destroy......");                                                                                                                                                                                           }
再在xml配置文件中配置
<bean id="person" class="com.wxh.blog.Person" init-method="init" destroy-method="destroy" p:name="wxh" p:age="22" p:car-ref="car"></bean>             
** 通过autowire自动装配
通过指定autowire属性可以让容器管理JavaBean自动注入依赖的对象。这样可以大大的简化配置文件的复杂度和代码量。

autowire可选参数常用的包括:

>> No: 默认值,默认是不启动自动装配的

>> byname: 通过bean属性的名字来查找Bean依赖的对象并注入

>> byType: 通过Bean属性的类型查找Bean依赖的对象并注入

<bean id="car" class="com.wxh.blog.Car">       <constructor-arg value="吉利" ></constructor-arg>       <constructor-arg value="120000"></constructor-arg>    </bean>       <bean id="person1" class="com.wxh.blog.Person" p:name="wxh" p:age="22" autowire="byName"></bean>                                                                         <bean id="person2" class="com.wxh.blog.Person" p:name="wxh" p:age="22" autowire="byType"></bean>   
** Spring Bean之间的关系
Spring Bean之间的关系有继承[parent]和依赖[depends-on]

继承:子Bean可以继承父Bean就像Java中一样,子类的属性值可以覆盖父类。可以使用parent关键字继承

<!-- parent bean -->    <bean id="parent" class="com.wxh.blog.Person" p:car-ref="car"></bean>    <!-- extends bean -->    <bean id="children1" class="com.wxh.blog.Person"  p:name="wxh" p:age="22" parent="parent"></bean>                                                                              <bean id="children2" class="com.wxh.blog.Person"  p:name="wqc" p:age="21" parent="parent"></bean>

结果:

Person [name=wxh, age=22, car=Car [brand=吉利, price=120000]]

Person [name=wqc, age=21, car=Car [brand=吉利, price=120000]]

当然父bean还可以当模板bean,只需要加上abstract=”true”就行了。

<!-- parent bean -->    <bean id="parent" p:car-ref="car" abstract="true"></bean>    <!-- extends bean -->    <bean id="children1" class="com.wxh.blog.Person"  p:name="wxh" p:age="22" parent="parent"></bean>    <bean id="children2" class="com.wxh.blog.Person"  p:name="wqc" p:age="21" parent="parent"></bean>      

依赖:在创建bean的时候一定要依赖于其他的bean先创建才能创建。通过depends-on可以指定依赖的bean
    <bean id="person" class="com.wxh.blog.Person" p:name="wxh" p:age="22" parent="parent" depends-on="car"></bean
** 通过工厂方法配置bean
调用静态方法创建Bean是将对象创建的过程封装到静态方法中,要声明静态方法创建Bean,需要用到factory-method,如果有参数可以用constrctor-arg元素传递参数。

先创建一个工厂类CarFactory.java

/** * 单例模式,且线程安全*/publicclass CarFactory {                                                                                                                                                                                                                privateintid;    private String name;       private CarFactory() {}       publicstatic CarFactory getInstance(){       return creatCarFactory.carFactory;    }       privatestaticclass creatCarFactory{       privatestatic CarFactory carFactory=new CarFactory();    }       publicint getId() {       returnid;    }     publicvoid setId(intid) {       this.id = id;    }     public String getName() {       returnname;    }     publicvoid setName(String name) {       this.name = name;    }     @Override    public String toString() {       return"CarFactory [id=" + id + ", name=" + name + "]";    }}
使用factory-method指定静态的工厂方法

     <bean id="carFactory" class="com.wxh.blog.CarFactory" factory-method="getInstance"></bean>  


0 0
原创粉丝点击