spring—Bean配置

2024-09-08 09:58
文章标签 java 配置 spring bean

本文主要是介绍spring—Bean配置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

publicstaticvoid 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

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

    }  

}

配置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>                                                                                      

还可以用实例工厂方法,即现需要创建工厂本身,再调用工厂的实例方法来返回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>                                  

这篇关于spring—Bean配置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147794

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。