Spring5 XML装配Bean

Posted 冰点IT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring5 XML装配Bean相关的知识,希望对你有一定的参考价值。

XML装配Bean的方式是Spring最初描述配置的主要方式,当然就现在还是有很多人以此方式来装配Bean,下面我们就来探讨以XML的形式装配Bean,来看看Spring配置文件的强大!

1、XML装配Bean

1.1、创建Spring配置文件规范

由于我使用的是IDEA编译器,那我就简单说一下IDEA是如何创建Spring配置文件的,来看截图:

Spring配置文件规范:

<?xml version="1.0" encoding="UTF-8"?><beansxmlns="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>

其实也很容易理解,这段配置跟JavaConfig@Configuration起类似的效果。

1.2、声明一个简单的Bean

XML中我们需要使用<bean/>标签来声明一个Bean,就好比我们在JavaConfig中使用@Bean来声明Bean是一样的。

<!-- 声明Blog这个Bean--><bean class="com.icypt.learn.service.Blog"/>

       默认情况下这个BeanIDcom.icypt.learn.service.Blog#0,“#0”是一种计数方式,用来区别同一类的不同实例。但是这个ID在我们后续引用中会显得特别冗长、不太方便,为了使我们的代码具有可读性,我们使用<bean/>标签的id属性指定BeanID

<bean id="blog" class="com.icypt.learn.service.Blog"/>

       至此我们一个简单的Bean声明完成,下面做个简单的测试。

编写测试代码

public class Blog { public void sayHello() { System.out.println("***************helloworld!****************"); }}public class User { public void getUser() { System.out.println("*********我是icypt************"); }}public class TestXmlConfigBean {private static ClassPathXmlApplicationContext acac = new ClassPathXmlApplicationContext("application.xml"); public static voidmain(String[] args) { Blog blog =acac.getBean("blog", Blog.class); blog.sayHello(); }}

运行测试结果

18:16:06,315 DEBUG main xml.XmlBeanDefinitionReader:395 - Loaded 1bean definitions from class path resource [application.xml]18:16:06,388 DEBUG main support.DefaultListableBeanFactory:213 -Creating shared instance of singleton bean 'blog'***************hello world!****************

       通过测试结果可以发现,我们已经成功的使用XML配置完成了一个简单Bean的装配。

1.3、使用XML配置进行依赖注入

1.3.1、使用构造器注入

1、注入Bean对象

修改Blog类让它依赖User类:

public class Blog { private User user; public Blog(User user) { this.user = user; } public void sayHello() { System.out.println("***************helloworld!****************"); }}

注入配置:

<bean id="user"class="com.icypt.learn.service.User"/><bean id="blog"class="com.icypt.learn.service.Blog"> <!-- 构造注入user--> <constructor-argref="user"/></bean>

<constructor-argref="user"/>:将User的应用传递到Blog的构造器中完成注入。

对于以上的注入方式,我们也可采用Springc命名空间更加简洁的完成配置:

<bean id="blog"class="com.icypt.learn.service.Blog" c:user-ref="user"/>

c:user-ref="user":其中c表示命名空间,user表示构造参数名称,-ref和传统的配置一样,表示传递的引用ID

       其实我们还可以通过构造参数索引定位参数的位置:

<!-- 普通构造注入依赖构造参数索引位置--><bean id="blog"class="com.icypt.learn.service.Blog"> <!-- 构造注入user--> <constructor-argindex="0" ref="user"/></bean>

       Index:表示的是构造参数的索引从0开始。

<!-- c标签构造注入依赖构造参数索引位置--><bean id="blog"class="com.icypt.learn.service.Blog" c:_0-ref="user"/>

       c:_0-ref_0表示的是构造参数的索引从0开始。

2、注入基本数据类型

修改Blog类:

public class Blog { private User user; private String blogName; private String blogTitle; private Integer blogSort; private List<String>blogTags; public Blog(StringblogName, String blogTitle, Integer blogSort, List<String> blogTags) { this.blogName =blogName; this.blogTitle =blogTitle; this.blogSort =blogSort; this.blogTags =blogTags; } public Blog(User user) { this.user = user; } public Blog() {  } public void sayHello() { System.out.println("***************helloworld!****************"); } public voidprintBlogTags() { for(String tag :this.blogTags) { System.out.println("**********" + tag); } }}

修改测试类:

@Testpublic void testPrintTags() { Blog blog =acac.getBean("blog", Blog.class); blog.printBlogTags();}

运行测试方法

21:10:15,682 DEBUG main xml.XmlBeanDefinitionReader:395 - Loaded 2bean definitions from class path resource [application.xml]21:10:15,767 DEBUG main support.DefaultListableBeanFactory:213 -Creating shared instance of singleton bean 'user'21:10:15,802 DEBUG main support.DefaultListableBeanFactory:213 -Creating shared instance of singleton bean 'blog'**********java**********spring**********springboot

根据运行结果可知,我们已成功注入基本数据类型。

普通构造写法和c标签写法混合使用:

<bean id="blog"class="com.icypt.learn.service.Blog"c:blogName="SpringBoot" c:_1="first boot"> <constructor-argindex="2"> <null/> </constructor-arg> <constructor-argindex="3"> <list> <value>java</value> <value>spring</value> <value>springboot</value> </list> </constructor-arg></bean>

       <null/>表示传入一个null值。

       注入set集合和list 类似这里就不做演示了,需要注意的是,setvalue的值如果是重复的则会被覆盖,且注入的set集合顺序是无序的。

1.3.2、使用setter方法注入

新建Movie类:

public class Movie { private String movieName; private String movieDesc; private Double price; private User user; private List<String>movieTags; public voidsetMovieName(String movieName) { this.movieName =movieName; } public voidsetMovieDesc(String movieDesc) { this.movieDesc = movieDesc; } public voidsetPrice(Double price) { this.price = price; } public void setUser(Useruser) { this.user = user; } public voidsetMovieTags(List<String> movieTags) { this.movieTags =movieTags; } public void printMovieInfo() { System.out.println("********电影名称************"+ this.movieName); System.out.println("********电影描述************"+ this.movieDesc); System.out.println("********电影价格************"+ this.price + "元"); String tags =""; for(String str :movieTags) { tags += str +","; } System.out.println("********电影标签************{"+ tags.substring(0, tags.lastIndexOf(",")) +"}"); }}

修改配置文件:

<bean id="movie" class="com.icypt.learn.service.Movie"> <propertyname="movieName" value="战狼"/> <propertyname="movieDesc" value="比较好看的军事题材电影"/> <propertyname="price" value="35.00"/> <propertyname="movieTags"> <list> <value>军事</value> <value>特种兵</value> <value>坦克漂移</value> </list> </property></bean>

       <property>标签是依赖setter方法注入的,所以Movie类中必须要有对应属性的setter方法。

运行结果如下:

21:48:30,911 DEBUG main xml.XmlBeanDefinitionReader:395 - Loaded 2bean definitions from class path resource [application.xml]21:48:30,982 DEBUG main support.DefaultListableBeanFactory:213 -Creating shared instance of singleton bean 'user'21:48:31,023 DEBUG main support.DefaultListableBeanFactory:213 -Creating shared instance of singleton bean 'movie'********电影名称************战狼********电影描述************比较好看的军事题材电影********电影价格************35.0元********电影标签************{军事,特种兵,坦克漂移}

       通过运行结果可以发现,我们已经成功的通过setter完成了基本数据类型的注入。

       与构造方法注入类似setter方法注入spring也提供了一种p命名空间,下面来看p标签的使用。

<bean id="movie"class="com.icypt.learn.service.Movie" p:movieName="战狼" p:price="35.00" p:user-ref="user" p:movieDesc="比较好看的军事题材电影"> <propertyname="movieTags"> <list> <value>军事</value> <value>特种兵</value> <value>坦克漂移</value> </list> </property></bean>

       看起来p标签的写法更为优雅一些,实际开发中还是要根据个人习惯选择。

       通过构造器和setter方法的注入我们发现如果使用命名空间的方式注入时,对于集合数据类型我们还是采用普通的方式注入,那么下面我们引出Spring的另一个命名空间util

修改之前配置:

<!-- 使用util命名空间定义Map集合 --><util:list id="movieTags"> <value>军事</value> <value>特种兵</value> <value>坦克漂移</value></util:list><!-- 使用p命名空间setter方法注入 --><bean id="movie"class="com.icypt.learn.service.Movie" p:movieName="战狼" p:price="35.00" p:user-ref="user" p:movieDesc="比较好看的军事题材电影" p:movieTags-ref="movieTags"></bean>

       这样以来是不是我们的配置显得更加简洁与优雅,那么对于util命名空间的支持,spirng总共提供了五种标签元素:

       <util:constant>:定义静态常量;

       <util:list>:定义list集合;

       <util:map>:定义map集合;

       <util:set>:定义set集合;

       <util:properties>:定义properties集合;

<util:property-path>:取得bean某一属性的值;

      如何使用这里就不做演示了,因为比较简单且使用方式都很类似,大家有时间可以去看一下官方文档搜索“the util schema”就可以找到所有有关util命名空间的使用方式了。

关注我

冰点IT,探索最新开发技术,记录追求梦想的点点滴滴!


    长按二维码,或点击最上方蓝色的 冰点IT 关注我,您的关注是对我最好的鼓励!





以上是关于Spring5 XML装配Bean的主要内容,如果未能解决你的问题,请参考以下文章

Spring5 自动化装配Bean

[Spring5]IOC容器_Bean管理XML方式_自动装配

Spring5Bean 的自动装配及注解开发

Java Spring5之IOC容器

Spring5 解决Bean在自动装配时的歧义性

Spring5 条件化的Bean装配之Conditional的使用