• spring—Bean配置


     

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

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

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

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

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

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

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

    ** 配置并使用第一个bean

    准备一个Bean,在这个类中有name和age属性

    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

    publicstaticvoid main(String[] args) {

           ApplicationContext ac=new ClassPathXmlApplicationContext("beans-example.xml");                                                                                                   

           Person person=(Person) ac.getBean("person");

           System.out.println(person.toString());

        }

    ApplictionContext:应用上下文接口,派生与BeanFactory,BeanFactory是Spring的核心但是功能比较单一。

    ApplicationContext接口的实现类有三个:

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

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

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

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

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

    首先添加一个Car类

    publicclass 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 + "]";

        }   

    }

    配置Car的Bean

    <bean id="car" class="com.wxh.blog.Car">

           <constructor-arg value="吉利" ></constructor-arg>

           <constructor-arg value="120000"></constructor-arg>                                                                                                                                                    

        </bean>

    利用ref引用car的bean

    <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"

    这里主要使用list、map、和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-method和destroy-method?

    先在class中添加一个init和destroy方法

    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>                                                                                       

    还可以用实例工厂方法,即现需要创建工厂本身,再调用工厂的实例方法来返回bean的实例。就是getInstance方法不是静态的,factory-bean指定工厂Bean,factory-method指定工厂方法。

      <bean id="carFactory" class="com.wxh.blog.CarFactory"></bean>

         <bean id="factroy" factory-bean="carFactory" factory-method="getInstance"></bean>                                                                                                          

    ** 使用SpEL表达式装配

    SpEL表达式中用#{}界定符把值装配到Bean的属性中,#{}会提示Spring这个里边是SpEL表达式。

    使用字面值、通过ID应用其他Bean或者Bean的属性,方法等

      <bean id="personOfSpEL" class="com.wxh.model.Person" p:id="#{1111}" p:name="#{'吴鑫晖'}" p:car="#{cars}" p:more="#{more}"></bean>                       

    在SpEL中使用T()运算符调用类作用域的方法和常量。例如

    <property name="id" value="#{T(java.lang.Math).random()*100}"></property>                                                                                                                            

    在SpEL值执行操作

             在SpEl中提供了几种运算符,在这些运算符可以用在SpEL表达式中的值上。

    <constructor-arg name="avgScore"

        value="#{(T(java.lang.Math).random()*100+T(java.lang.Math).random()*100+T(java.lang.Math).random()*100)/3}"></constructor-arg>                                   

     
  • 相关阅读:
    前端各种小细节
    图片等比例缩放
    微信小程序倒计时,购物车,向左滑删除 左拉删除
    微信小程序用户拒绝授权,重新调起授权
    微信小程序swiper切换卡内嵌滚动条不显示
    php面试总结
    tp5.0 学习(三):URL和路由
    pytorch 基础内容
    Grammarly for Chrome-语法、用词自动检查
    时空图神经网路:STGNNs
  • 原文地址:https://www.cnblogs.com/williamjie/p/9198195.html
Copyright © 2020-2023  润新知