Spring之路(8)--提高资源管理的灵活性(使用JavaConfig定义bean)

简介: 本文目录1. 注解方式配置bean的局限性2. 思考如何解决3. 三种方式对比4. 使用JavaConfig定义bean的具体实例4.1 来个普普通通的类4.2 来个普普通通的方法返回我们想要的对象4.3 添加@bean注解,使方法的返回值成为bean4.4 添加@Configuration注解启用配置4.5 测试运行5. 总结

1. 注解方式配置bean的局限性

使用注解代替xml配置bean之后,效率得到了显著提升,我们程序员写起代码了也甚是爽快,毕竟相对于编写xml,写代码无疑是更加爽快的。


使用注解定义bean的方式虽然方便快速,灵活性却有所不足,举个最简单的例子,我们使用xml可以生成同一类型的多个bean,例如下面生成了两个Singer类型的bean。


<bean id="zhoujielun" class="org.maoge.xmlbeandetail.Singer">

 <property name="name" value="周杰伦"></property>

</bean>

<bean id="linjunjie" class="org.maoge.xmlbeandetail.Singer">

 <property name="name" value="林俊杰"></property>

</bean>


但是使用注解时,一个类型下只能生成一个bean,如下:


@Component("zhoujielun")

public class Singer {

}


显然,使用注解后虽然效率提升,但是貌似功能不如xml强大了。


2. 思考如何解决

使用xml,需要额外写xml配置文件,效率低下。


而使用注解,一个注解只能加到一个类上,也就是说一个类只能生成一个bean,功能有所欠缺。


那么如何既能利用注解快速生成多个bean,同时bean还可以自定义其名称(id)和相关属性呢?


哈哈,其实不难,我们可以将注解加到方法上,然后返回值类型作为bean的类型,不就解决问题了。返回同样类型的方法可以定义任意多个,解决了对类使用注解定义bean时不能生成多个bean的问题;同时注解直接加到方法上,也不用再单独定义xml文件描述bean和其类型的关联。可谓:效率提升的同时又兼具灵活性!


3. 三种方式对比

好的,到目前为止,Spring容器中配置bean的三种方式我们都发现了:xml、注解、JavaConfig,我们来对比下:


xml功能很强,但是不够方便快速(代码量比较大)

注解非常方便快速,但是功能不够强大(有些bean描述不了)

JavaConfig比较方便快速,同时功能也足够强大

注意哈,大家可能普遍比较了解xml和注解方式,反而对比较先进的JavaConfig方式不熟悉,此处原因我认为是这样的:xml产生的比较早,网上相关的文档也比较多,所以大家比较熟悉。注解方式代码量非常精简,而且足以满足大多数场景使用,现在用的也比较多,所以大家比较熟悉;JavaConfig方式虽然足够锋利,但是由于历史等原因,目前还不足够的流行,但是其实它真的棒棒哒,我认为这种方式:真的真的很不错。


最后必须强调一点:三种方式只是方式不同,没有本质区别,都是为Spring容器提供配置信息。大家可以根据实际情况灵活选用,反正我个人是倾向于注解+JavaConfig的方式,为何?因为注解足够简单,而JavaConfig足够灵活,xml确实比较麻烦。


4. 使用JavaConfig定义bean的具体实例

光说不练那是假把式,必须得有实例。但是前提是兄弟们咱已经把事情的来龙去脉说清楚了,要是不知道为何而来从何而去,比较容易混淆概念,从而容易懵圈。


说实话我Spring写了很久了,还搞不清楚这三种方式的区别,后来是靠着我强悍的大脑的超强理解能力才分清楚的(请原谅我无脑的对自己的吹捧,朋友们我就是这么一个人,非常完美吭)。


话不多少,酒不多喝,实例走起!


4.1 来个普普通通的类

普普通通,毫无污染的普通Java类一个,供您鉴赏。


package org.maoge.javaconfigbean;

public class Singer {

private String name;

public void sing() {

 System.out.println("歌手[" + name + "]开唱啦,快挥舞起你手中的荧光棒吧");

}

public String getName() {

 return name;

}

public void setName(String name) {

 this.name = name;

}

}



4.2 来个普普通通的方法返回我们想要的对象

我们定义两个方法,返回我们想要的对象,这两个方法到目前为止是再普通不过的普通方法。


package org.maoge.javaconfigbean;

public class BeanConfiguration {

/**

 * 返回歌手周杰伦

 */

public Singer zhoujielun() {

 Singer singer = new Singer();

 singer.setName("周杰伦");

 return singer;

}

/**

 * 返回歌手林俊杰

 */

public Singer linjunjie() {

 Singer singer = new Singer();

 singer.setName("林俊杰");

 return singer;

}

}


4.3 添加@bean注解,使方法的返回值成为bean

通过在方法上添加@bean注解,Spring容器会将方法的返回值作为bean放入容器中,而bean的名字就是方法的名字。


package org.maoge.javaconfigbean;

import org.springframework.context.annotation.Bean;

public class BeanConfiguration {

/**

 * 返回歌手周杰伦 通过@Bean告知容器,将该方法的返回值作为bean放入容器中管理

 */

@Bean

public Singer zhoujielun() {

 Singer singer = new Singer();

 singer.setName("周杰伦");

 return singer;

}

/**

 * 返回歌手林俊杰 通过@Bean告知容器,将该方法的返回值作为bean放入容器中管理

 */

@Bean

public Singer linjunjie() {

 Singer singer = new Singer();

 singer.setName("林俊杰");

 return singer;

}

}


4.4 添加@Configuration注解启用配置

在之前讲述使用注解定义bean时,我们有一个xml配置context:component-scan,用来扫描指定的包下面的bean。


在使用JavaConfig定义bean是也类似,我们需要在类上添加注解@Configuration,来告诉Spring,该类是一个配置类,里面可能包含bean的定义,请扫描我。具体代码如下:


package org.maoge.javaconfigbean;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

/**

* 通过@Configuration告诉Spring,本类是一个配置类,请扫描本类中的bean

*/

@Configuration

public class BeanConfiguration {

/**

 * 返回歌手周杰伦

 */

@Bean

public Singer zhoujielun() {

 Singer singer = new Singer();

 singer.setName("周杰伦");

 return singer;

}

/**

 * 返回歌手林俊杰

 */

@Bean

public Singer linjunjie() {

 Singer singer = new Singer();

 singer.setName("林俊杰");

 return singer;

}

}


4.5 测试运行

这一步就很简单了,先通过配置类获取容器对象,然后从容器中获取定义的bean,然后运行bean的方法。


注意AnnotationConfigApplicationContext也好理解,就是Spring给我们封装好的类,它可以读取类中注解的配置信息(此处读取BeanConfiguration.class),然后根据配置信息为我们生成容器,我们直接调用就行。


package org.maoge.javaconfigbean;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class JavaConfigContainerDemo {

public static void main(String[] args) {

 //通过BeanConfiguration.class获取对Spring容器的配置信息,然后返回context指向容器

 AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(BeanConfiguration.class);

 //从容器中获取对象

 Singer zhoujielun=(Singer) context.getBean("zhoujielun");

 zhoujielun.sing();

 //从容器中获取对象

 Singer linjunjie=(Singer) context.getBean("linjunjie");

 linjunjie.sing();

}

}


5. 总结

Spring提供了三种定义bean的方式,就好比我们生活中出行可以采用高铁、飞机、汽车、自行车、走路一样的道理,更加方便,可以根据实际情况灵活选用。


但是目的相同,都是为了给Spring容器提供配置信息,主要就是bean的定义信息。


后续我这边尽可能的对实例提供多种配置方法实现,以便于大家理解,我这边麻烦就麻烦点,但是要让大家感觉舒爽啊,哈哈!

相关文章
|
13天前
|
XML Java 数据格式
Spring从入门到入土(bean的一些子标签及注解的使用)
本文详细介绍了Spring框架中Bean的创建和使用,包括使用XML配置文件中的标签和注解来创建和管理Bean,以及如何通过构造器、Setter方法和属性注入来配置Bean。
53 9
Spring从入门到入土(bean的一些子标签及注解的使用)
|
3天前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
1月前
|
XML Java 数据格式
spring复习02,xml配置管理bean
详细讲解了Spring框架中基于XML配置文件管理bean的各种方式,包括获取bean、依赖注入、特殊值处理、属性赋值、集合类型处理、p命名空间、bean作用域及生命周期和自动装配。
spring复习02,xml配置管理bean
|
13天前
|
Java 开发者 Spring
Spring bean的生命周期详解!
本文详细解析Spring Bean的生命周期及其核心概念,并深入源码分析。Spring Bean是Spring框架的核心,由容器管理其生命周期。从实例化到销毁,共经历十个阶段,包括属性赋值、接口回调、初始化及销毁等。通过剖析`BeanFactory`、`ApplicationContext`等关键接口与类,帮助你深入了解Spring Bean的管理机制。希望本文能助你更好地掌握Spring Bean生命周期。
42 1
|
15天前
|
Java Spring
获取spring工厂中bean对象的两种方式
获取spring工厂中bean对象的两种方式
16 1
|
16天前
|
Java 开发者 Spring
Spring bean的生命周期详解!
本文详细介绍了Spring框架中的核心概念——Spring Bean的生命周期,包括实例化、属性赋值、接口回调、初始化、使用及销毁等10个阶段,并深入剖析了相关源码,如`BeanFactory`、`DefaultListableBeanFactory`和`BeanPostProcessor`等关键类与接口。通过理解这些核心组件,读者可以更好地掌握Spring Bean的管理和控制机制。
50 1
|
1月前
|
XML Java 数据格式
spring复习03,注解配置管理bean
Spring框架中使用注解配置管理bean的方法,包括常用注解的标识组件、扫描组件、基于注解的自动装配以及使用注解后的注意事项,并提供了一个基于注解自动装配的完整示例。
spring复习03,注解配置管理bean
|
2月前
|
机器学习/深度学习 数据采集 算法框架/工具
使用Python实现深度学习模型:智能人力资源管理与招聘
【8月更文挑战第12天】 使用Python实现深度学习模型:智能人力资源管理与招聘
82 2
|
3月前
|
数据采集 监控 数据安全/隐私保护
ERP系统中的人力资源管理与员工绩效评估解析
【7月更文挑战第25天】 ERP系统中的人力资源管理与员工绩效评估解析
205 1
|
3月前
|
机器学习/深度学习 Oracle 安全
人力资源管理革新:6款系统一站式解决HR事务
**Zoho People、BambooHR、Workday、ADP Workforce Now和Oracle HCM Cloud是知名的人力资源管理系统。Zoho People提供模块化设计、移动应用和自动化工作流;BambooHR以用户友好界面和员工档案管理见长;Workday侧重全球化云解决方案和智能决策工具;ADP Workforce Now集成HR与薪资管理,强调合规性;Oracle HCM Cloud则以高度定制和分析工具闻名。这些系统各有特点,适用于不同规模和需求的企业。**
79 11