跟着刚哥学习Spring框架--通过XML方式配置Bean(三)

时间:2022-09-18 16:37:22

Spring配置Bean有两种形式(XML和注解)

今天我们学习通过XML方式配置Bean

1、 Bean的配置方式

  通过全类名(反射)的方式

    跟着刚哥学习Spring框架--通过XML方式配置Bean(三)

    √ id:标识容器中的bean。id唯一。

    √ class:bean的全类名,通过反射的方式在IOC容器中创建Bean,所以要求Bean中必须有无参的构造器

2、依赖注入的方式

  1)属性注入:通过setter方法注入Bean的属性值或依赖的对象

  跟着刚哥学习Spring框架--通过XML方式配置Bean(三)

  属性注入使用<Property>元素,使用name指定Bean的属性名称,使用value指定Bean的属性的值

  2)构造器注册:通过构造方法注入Bean的属性和值

  首先创建一个Car类

 public class Car {
private String brand;
private int speed;
private String color;
public Car(String brand, int speed, String color) {
this.brand = brand;
this.speed = speed;
this.color = color;
}
@Override
public String toString() {
return "Car [brand=" + brand + ", speed=" + speed + ", color=" + color + "]";
} }

  然后加入配置文件配置节点

 <bean id="car" class="com.hzg.spring.beans.Car">
<constructor-arg value="Audi"></constructor-arg>
<constructor-arg value="120"></constructor-arg>
<constructor-arg value="black"></constructor-arg>
</bean>

  Main方法开启Spring容器并使用

 // 1.创建Spring 的IOC的容器对象
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); 4 // 2.从IOC容器中获取bean实例
Car car = (Car)ctx.getBean(Car.class); // 3、调用hello方法
System.out.println(car);

  输出结果:Car [brand=Audi, speed=120, color=black]

  如果想指定给属性的顺序赋值,可以使用index属性

 <bean id="car" class="com.hzg.spring.beans.Car">
<constructor-arg value="Audi" index="0"></constructor-arg>
<constructor-arg value="120" index="1"></constructor-arg>
<constructor-arg value="black" index="2"></constructor-arg>
</bean>

  如果想指定给属性的顺序赋值,也可以使用type属性

 <bean id="car" class="com.hzg.spring.beans.Car">
<constructor-arg value="Audi" type="java.lang.String"></constructor-arg>
<constructor-arg value="120" type="int"></constructor-arg>
<constructor-arg value="black" type="java.lang.String"></constructor-arg>
</bean>

  3)工厂方法注入

    此方式基本不用

3、引用其他Bean

  1)引用外部Bean

 <bean id="car" class="com.hzg.spring.beans.Car">
<constructor-arg value="Audi" type="java.lang.String"></constructor-arg>
<constructor-arg value="120" type="int"></constructor-arg>
<constructor-arg value="black" type="java.lang.String"></constructor-arg>
</bean> <bean id="person" class="com.hzg.spring.beans.Person">
<property name="name" value="hzg"></property>
<property name="age" value="32"></property>
<!-- 使用 property的ref属性建立Bean之间的引用关系-->
<property name="car" ref="car"></property>
</bean>
  使用 property的ref属性建立Bean之间的引用关系

  2)引用内部Bean

 <bean id="person" class="com.hzg.spring.beans.Person">
<property name="name" value="hzg"></property>
<property name="age" value="32"></property>
<!-- 内部Bean,不能被外部引用,只能在内部使用-->
<property name="car">
<bean class="com.hzg.spring.beans.Car">
<constructor-arg value="Audi" type="java.lang.String"></constructor-arg>
<constructor-arg value="120" type="int"></constructor-arg>
<constructor-arg value="black" type="java.lang.String"></constructor-arg>
</bean>
</property>
</bean>

  因为id是为了让外部引用,而内部Bean内部只用一次,不能被外部引用,随意不写id。

4、级联属性

 <bean id="person" class="com.hzg.spring.beans.Person">
<property name="name" value="hzg"></property>
<property name="age" value="32"></property>
<property name="car" ref="car"></property>
<!-- 级联属性赋值 -->
<property name="car.price" value="30000"></property>
</bean>

  注意:属性想用car.price的级联,首先car必须要先初始化,否则会有异常

4、集合属性

当我们的Bean中有集合元素的时候,Spring中可以通过一组内置的xml标签(<list>、<set>、<map>)来配置集合属性。

  1)List集合:

   刚才的Person类有一个car属性,现在我们修改一下,Person类中有一个List<car>,即一个人拥有多辆车。

 public class Person {
private String name;
private int age;
private List<Car> cars; //为上面的3个属性设置getter和setter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List<Car> getCars() {
return cars;
}
public void setCars(List<Car> cars) {
this.cars = cars;
}
}

  配置文件修改如下:

 <bean id="car1" class="com.hzg.spring.beans.Car">
<constructor-arg value="Audi" type="java.lang.String"></constructor-arg>
<constructor-arg value="120" type="int"></constructor-arg>
<constructor-arg value="black" type="java.lang.String"></constructor-arg>
</bean>
<bean id="car2" class="com.hzg.spring.beans.Car">
<constructor-arg value="Ford" type="java.lang.String"></constructor-arg>
<constructor-arg value="100" type="int"></constructor-arg>
<constructor-arg value="black" type="java.lang.String"></constructor-arg>
</bean>
<bean id="car3" class="com.hzg.spring.beans.Car">
<constructor-arg value="Toyota" type="java.lang.String"></constructor-arg>
<constructor-arg value="95" type="int"></constructor-arg>
<constructor-arg value="black" type="java.lang.String"></constructor-arg>
</bean>
<bean id="person" class="com.hzg.spring.beans.Person">
<property name="name" value="hzg"></property>
<property name="age" value="32"></property>
<!-- 集合属性(List),使用ref来配置子节点信息 -->
<property name="cars">
<list>
<ref bean="car1"></ref>
<ref bean="car2"></ref>
<ref bean="car3"></ref>
</list>
</property>
</bean>

   2)Map集合:

   如果是<map>集合的话,只需要把list换成map即可。

 <!-- 集合属性(Map),使用entry来配置map的子节点信息 -->
<property name="cars">
  <map>
4    <entry key="A" value-ref="car1" ></entry>
5    <entry key="B" value-ref="car2" ></entry>
</map>
</property>

 3) 现在这么多集合Bean能不能抽出来,以供多个Bean进行引用,那么就需要使用util

 <bean id="person" class="com.hzg.spring.beans.Person">
<property name="name" value="hzg"></property>
<property name="age" value="32"></property>
<!-- 引用util -->
<property name="cars" ref="cars"></property>
</bean>
<util:list id="cars">
<ref bean="car1"></ref>
<ref bean="car2"></ref>
</util:list>

 4)使用p命名空间 

  Sping从2.5版本开始引入一个新的P的命名空间,通过使用P命名空间后,使得Xml的配置方式进一步简化

 <!-- 通过P命名空间为Bean属性赋值,相对于传统的配置方式更加简洁 -->
<bean id="person" class="com.hzg.spring.beans.Person" p:name="hzg" p:age="32" p:cars-ref="cars">
</bean>

 5、使用autowire属性进行Bean的自动装配

 当我们要往一个bean的某个属性里注入另外一个bean,我们会使用<property ref=“”>标签的形式。但是对于大型项目这种方式其实是不可取的。

 <!--
大型项目中我们一般使用autowire属性自动装备Bean,autowire属性有两个值:byName和byType
byName:根据Bean的名字和当前的Bean的setter属性名称进行装配
byType:根据Bean的类型进行装配,若有1个以上的类型,则抛异常
-->
<bean id="person" class="com.hzg.spring.beans.Person" autowire="byType">
<property name="name" value="hzg"></property>
<property name="age" value="32"></property>
</bean>

  自动装配的特点:

   1)只有引用类型才可以自动装配。

   2)autowire属性是在bean的级别上,一旦指定,当前bean的所有引用类型都必须使用自动装配。

     3)byType和byName的只能选择其一。

6、配置上的继承(parent属性)

  当我们有两个或者以上的同一个类型的Bean做实例化的时候,我们可以将一些公共的提成通用Bean。这样其他的Bean继承它即可以了。

 <bean id="address1" class="com.hzg.Address" p:provice="Hebei" p:city="LangFang" p:street="YingBing">

 </bean>
<bean id="address2" class="com.hzg.Address" p:provice="Hebei" p:city="LangFang" p:street="YanLing"> </bean>
<bean id="address3" class="com.hzg.Address" p:provice="Hebei" p:city="LangFang" p:street="YanShun"> </bean>

  以上Bean中用的都是address这个类,都是省市街道的赋值,只是在街道上每个不一样,所以我们完全可以把通用的提出来。

 <bean id="address" class="com.hzg.Address" p:provice="Hebei" p:city="LangFang" p:street="YingBing">

 </bean>
<bean id="address1" parent="address" p:street="YanLing"> </bean>
<bean id="address2" parent="address" p:street="YanShun"> </bean>

7、Bean的作用域(scope属性)

<bean id="address" class="com.hzg.Address" p:provice="Hebei" p:city="LangFang" p:street="YanShun">

</bean>
 ApplicationContext ctx = new ClassPathXmlApplicationContext("configspring.xml");
Address address1 = (Address) ctx.getBean("address");
Address address2 = (Address) ctx.getBean("address");
System.out.println(address1==address2);

  输出结果为:true

  说明默认为单例模式的,它只要是看scope属性的。

  使用Bean的scope属性来配置Bean的作用域的,scope有两个重要的属性值。

    singleton默认值,容器初始化时创建Bean实例,在整个容器的生命周期内只创建一个Bean,单例的。

    prototype:原型的,容器初始化时不创建Bean的实例,而在每次请求时都创建一个新的Bean的实例,并返回。

8、使用外部属性文件(property-placeholder 属性占位符)

  新建一个db.properties文件

 user=root
password=
driverClass=com.mysql.jdbc
jdbcUrl=jdbc:mysql:///test

  配置上属性占位符文件的地址,并在使用的过程中使用${}的格式取值

 <!-- 导入属性文件 -->
<context:property-placeholder location="db.properties"></context:property-placeholder>
<bean id="dataSource" class="com.hzg.MyDataSource">
  <!-- 使用外部属性文件的属性值 -->
  <property name="user" value="${user}"></property>
  <property name="password" value="${password}"></property>
<property name="diverClass" value="${driverClass}"></property>
<property name="jdbcUrl" value="${jdbcUrl}"></property>
</bean>

  MyDataSource文件:

 public class MyDataSource {
private String user;
private String password;
private String diverClass;
private String jdbcUrl; public String getUser() {
return user;
} public void setUser(String user) {
this.user = user;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getDiverClass() {
return diverClass;
} public void setDiverClass(String diverClass) {
this.diverClass = diverClass;
} public String getJdbcUrl() {
return jdbcUrl;
} public void setJdbcUrl(String jdbcUrl) {
this.jdbcUrl = jdbcUrl;
} @Override
public String toString() {
return "MyDataSource{" +
"user='" + user + '\'' +
", password='" + password + '\'' +
", diverClass='" + diverClass + '\'' +
", jdbcUrl='" + jdbcUrl + '\'' +
'}';
}
}

  Main方法:

 ApplicationContext ctx = new ClassPathXmlApplicationContext("configspring.xml");
MyDataSource myDataSource = (MyDataSource) ctx.getBean("dataSource");
System.out.println(myDataSource);

  输出结果:MyDataSource{user='root', password='123456', diverClass='com.mysql.jdbc', jdbcUrl='jdbc:mysql:///test'}

9、Spring表达式SPEL表达式

 <bean id="person" class="com.hzg.Person">
2  <!-- 使用SpEL 来应用其他的Bean -->
3  <property name="car" value="#{car}"></property>
4  <!-- 使用SpEL 来应用其他的Bean的属性 -->
5  <property name="city" value="#{address.city}"></property>
6  <!-- 使用SpEL 中使用运算符 -->
7  <property name="info" value="#{car.price > 30000 ? '金领' : '白领'}"></property>
8  <!-- 使用SpEL 引用类的静态属性 -->
9  <property name="yaowei" value="#{T(java.lang.Math).PI * 80}"></property>
10 </bean>

10、Spring中Bean的生命周期

  1)创建Bean的实例

  2)为Bean的属性设置值和对其他Bean的引用

  3)Bean后置处理器postProcessBeforeInitialization方法

  4)调用Bean的初始化方法(init-method)

  5)Bean后置处理器的postProcessAfterInitialization方法

  6)Bean正常使用

  7)当容器关闭时,调用Bean的销毁方法(destroy-method)

 实例:

 public class Car {
public Car() {
System.out.println("构造器……");
}
private String brand; public void setBrand(String brand) {
System.out.println("设置属性……");
this.brand = brand;
}
public void init(){
System.out.println("初始化……");
}
public void destroy(){
System.out.println("销毁……");
}
}

  MyBeanProcessor必须实现BeanPostProcessor接口的两个方法

 public class MyBeanProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
System.out.println("postProcessBeforeInitialization……");
return o;
} @Override
public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
System.out.println("postProcessAfterInitialization……");
return o;
}
}

  配置文件

 <bean id="car" class="com.hzg.Car" p:brand="Audi" init-method="init" destroy-method="destroy"></bean>
<!-- 配置Bean的后置处理器 -->
<bean class="com.hzg.MyBeanProcessor"></bean>

  Main方法

 public static void main(String[] args) {
2  //由于ApplicationContext没有close方法,所以要使用它下面接口ConfigurableApplicationContext
3  ConfigurableApplicationContext ctx = new ClassPathXmlApplicationContext("configspring.xml");
4  Car car = (Car) ctx.getBean("car");
5  System.out.println("使用Bean:" + car.toString());
6  //关闭IOC容器
7  ctx.close();
8 }

  输出结果:

postProcessBeforeInitialization……
postProcessAfterInitialization……
构造器……
设置属性……
postProcessBeforeInitialization……
初始化……
postProcessAfterInitialization……
使用Bean:com.hzg.Car@2d928643
销毁……

-------------------------------------------------------------------------------------------------------------------------

跟着刚哥学习Spring框架系列:

跟着刚哥学习Spring框架--创建HelloWorld项目(一)

跟着刚哥学习Spring框架--Spring容器(二)

跟着刚哥学习Spring框架--通过XML方式配置Bean(三)

跟着刚哥学习Spring框架--通过注解方式配置Bean(四)

跟着刚哥学习Spring框架--AOP(五)

跟着刚哥学习Spring框架--JDBC(六)

跟着刚哥学习Spring框架--事务配置(七)

  

跟着刚哥学习Spring框架--通过XML方式配置Bean(三)的更多相关文章

  1. 跟着刚哥学习Spring框架--通过注解方式配置Bean(四)

    组件扫描:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定组件包括: 1.@Component:基本注解,识别一个受Spring管理的组件 2.@Resposit ...

  2. 跟着刚哥学习Spring框架--创建HelloWorld项目(一)

    1.Spring框架简介 Spring是一个开源框架,Spring是在2003年兴起的一个轻量级的开源框架,由Rod johnson创建.主要对JavaBean的生命周期进行管理的轻量级框架,Spri ...

  3. 跟着刚哥学习Spring框架--AOP(五)

    AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入 ...

  4. 跟着刚哥学习Spring框架--Spring容器(二)

    Spring容器 启动Spring容器(实例化容器) -- IOC容器读取Bean配置创建Bean实例之前,必须对它进行实例化(加载启动),这样才可以从容器中获取Bean的实例并使用.  Bean是S ...

  5. 跟着刚哥学习Spring框架--事务配置(七)

    事务 事务用来保证数据的完整性和一致性. 事务应该具有4个属性:原子性.一致性.隔离性.持久性.这四个属性通常称为ACID特性.1.原子性(atomicity).一个事务是一个不可分割的工作单位,事务 ...

  6. 跟着刚哥学习Spring框架--JDBC(六)

    Spring的JDBC框架 Spring JDBC提供了一套JDBC抽象框架,用于简化JDBC开发. Spring主要提供JDBC模板方式.关系数据库对象化方式.SimpleJdbc方式.事务管理来简 ...

  7. spring学习笔记 星球日one - xml方式配置bean

    ide: idea lib包的导入:http://webcache.googleusercontent.com/search?q=cache:http://zyjustin9.iteye.com/bl ...

  8. 4&period; Spring 如何通过 XML 文件配置Bean,以及如何获取Bean

    在 Spring 容器内拼凑 bean 叫做装配.装配 bean 的时候,你是在告诉容器,需要哪些 bean ,以及容器如何使用依赖注入将它们配合在一起. 理论上,bean 装配的信息可以从任何资源获 ...

  9. spring之通过注解方式配置Bean(一)

    (1)组件扫描:spring能够从classpath下自动扫描.侦测和实例化具有特定注解的组件. (2)特定组件包括: @Component:基本注解,标识一个受spring管理的组件: @Respo ...

随机推荐

  1. C&plus;&plus; vector erase函数的使用注意事项

    最近使用了顺序容器的删除元素操作,特此记录下该函数的注意事项. 在C++primer中对c.erase(p) 这样解释的:  c.erase(p)    删除迭代器p所指向的元素,返回一个指向被删元素 ...

  2. 【poj1274】 The Perfect Stall

    http://poj.org/problem?id=1274 (题目链接) 题意 懒得写了 Solution 二分图匹配裸题.注意清空数组. 代码 // poj3020 #include<alg ...

  3. 第三方类AFNetworking

    1.AFNetworking简介 AFNetworking是一个在iOS开发中使用非常多的轻量级网络开源库适用于iOS以及Mac OS X.它构建于在(Apple iOS开发文档) NSURLConn ...

  4. day55

    担心了好久的编译原理也总是考完了 大学里的最后一次考试也是结束罗 这次的考试起伏跌宕啊 我们本来是9点钟开始考试 但是我们班的几个同学基本上7点钟就去了 为了什么?? 选个好的位置撒哈哈,到了九点,老 ...

  5. 物体*落体动态模拟(Linear Subspace)

    三维物体变形方法赋予了模拟物体的动态特性,但是随着物体模型的复杂度慢慢增加,对高质量的实时变形方法也提出了更高的要求.对于高精度的大型三维网格而言,通常会设计一个低精度的子网格,并构建子网格与原始网格 ...

  6. 二、springcloud Netflix 注册中心

    Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现.也是springcloud体系中最重要最核心的组 ...

  7. 《SpringMVC从入门到放肆》十三、SpringMVC数据校验

    上一章,我们学习了SpringMVC的自定义类型转换器,但是如果转换后的数据传递到Controller的方法中,忽然发现有某些属性为Null了,这怎么办?我们需要一种有效的数据校验机制,来对数据进行有 ...

  8. vue-9-动画

    transition: <div id="demo"> <button v-on:click="show = !show"> Toggl ...

  9. Unity调用Window提示框Yes&sol;No(英文提示窗)

    Unity调用Windows弹提示框 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...

  10. 1-2Html与CSS的关系

    Html和CSS的关系 基于微信的后台开发须要掌握的基础知识包括有:HTML.CSS.JavaScript语言. 以下我们就来了解下这三门技术都是用来实现什么的: 1. HTML是网页内容的载体.内容 ...