您现在的位置是:亿华云 > 域名
惊呆了,Spring中竟然有12种定义Bean的方法
亿华云2025-10-02 18:42:07【域名】1人已围观
简介本文转载自微信公众号「苏三说技术」,作者因为热爱所以坚持ing 。转载本文请联系苏三说技术公众号。前言在庞大的java体系中,spring有着举足轻重的地位,它给每位开发者带来了极大的便利和惊喜。我们
本文转载自微信公众号「苏三说技术」,惊呆了作者因为热爱所以坚持ing 。中竟种定转载本文请联系苏三说技术公众号。惊呆了
前言
在庞大的中竟种定java体系中,spring有着举足轻重的惊呆了地位,它给每位开发者带来了极大的中竟种定便利和惊喜。我们都知道spring是惊呆了创建和管理bean的工厂,它提供了多种定义bean的中竟种定方式,能够满足我们日常工作中的惊呆了多种业务场景。
那么问题来了,中竟种定你知道spring中有哪些方式可以定义bean?惊呆了
我估计很多人会说出以下三种:
没错,但我想说的中竟种定是以上三种方式只是开胃小菜,实际上spring的惊呆了功能远比你想象中更强大。
各位看官如果不信,中竟种定请继续往下看。惊呆了
1. xml文件配置bean
我们先从xml配置bean开始,它是spring最早支持的方式。后来,随着springboot越来越受欢迎,该方法目前已经用得很少了,但我建议我们还是网站模板有必要了解一下。
1.1 构造器
如果你之前有在bean.xml文件中配置过bean的经历,那么对如下的配置肯定不会陌生:
<bean id="personService" class="com.sue.cache.service.test7.PersonService"> </bean>这种方式是以前使用最多的方式,它默认使用了无参构造器创建bean。
当然我们还可以使用有参的构造器,通过标签来完成配置。
<bean id="personService" class="com.sue.cache.service.test7.PersonService"> <constructor-arg index="0" value="susan"></constructor-arg> <constructor-arg index="1" ref="baseInfo"></constructor-arg> </bean>其中:
index表示下标,从0开始。 value表示常量值 ref表示引用另一个bean1.2 setter方法
除此之外,spring还提供了另外一种思路:通过setter方法设置bean所需参数,这种方式耦合性相对较低,比有参构造器使用更为广泛。
先定义Person实体:
@Data public class Person { private String name; private int age; }它里面包含:成员变量name和age,getter/setter方法。
然后在bean.xml文件中配置bean时,加上<:property>标签设置bean所需参数。
<bean id="person" class="com.sue.cache.service.test7.Person"> <property name="name" value="susan"></constructor-arg> <property name="age" value="18"></constructor-arg> </bean>1.3 静态工厂
这种方式的关键是需要定义一个工厂类,它里面包含一个创建bean的静态方法。例如:
public class SusanBeanFactory { public static Person createPerson(String name, int age) { return new Person(name, age); } }接下来定义Person类如下:
@AllArgsConstructor @NoArgsConstructor @Data public class Person { private String name; private int age; }它里面包含:成员变量name和age,getter/setter方法,无参构造器和全参构造器。
然后在bean.xml文件中配置bean时,通过factory-method参数指定静态工厂方法,同时通过设置相关参数。
<bean class="com.sue.cache.service.test7.SusanBeanFactory" factory-method="createPerson"> <constructor-arg index="0" value="susan"></constructor-arg> <constructor-arg index="1" value="18"></constructor-arg> </bean>1.4 实例工厂方法
这种方式也需要定义一个工厂类,云南idc服务商但里面包含非静态的创建bean的方法。
public class SusanBeanFactory { public Person createPerson(String name, int age) { return new Person(name, age); } }Person类跟上面一样,就不多说了。
然后bean.xml文件中配置bean时,需要先配置工厂bean。然后在配置实例bean时,通过factory-bean参数指定该工厂bean的引用。
<bean id="susanBeanFactory" class="com.sue.cache.service.test7.SusanBeanFactory"> </bean> <bean factory-bean="susanBeanFactory" factory-method="createPerson"> <constructor-arg index="0" value="susan"></constructor-arg> <constructor-arg index="1" value="18"></constructor-arg> </bean>1.5 FactoryBean
不知道大家有没有发现,上面的实例工厂方法每次都需要创建一个工厂类,不方面统一管理。
这时我们可以使用FactoryBean接口。
public class UserFactoryBean implements FactoryBean<User> { @Override public User getObject() throws Exception { return new User(); } @Override public Class<?> getObjectType() { return User.class; } }在它的getObject方法中可以实现我们自己的逻辑创建对象,并且在getObjectType方法中我们可以定义对象的类型。
然后在bean.xml文件中配置bean时,只需像普通的bean一样配置即可。
<bean id="userFactoryBean" class="com.sue.async.service.UserFactoryBean"> </bean>轻松搞定,so easy。
注意:getBean("userFactoryBean");获取的是getObject方法中返回的对象。而getBean("&userFactoryBean");获取的才是真正的UserFactoryBean对象。亿华云
我们通过上面五种方式,在bean.xml文件中把bean配置好之后,spring就会自动扫描和解析相应的标签,并且帮我们创建和实例化bean,然后放入spring容器中。
虽说基于xml文件的方式配置bean,简单而且非常灵活,比较适合一些小项目。但如果遇到比较复杂的项目,则需要配置大量的bean,而且bean之间的关系错综复杂,这样久而久之会导致xml文件迅速膨胀,非常不利于bean的管理。
2. Component注解
为了解决bean太多时,xml文件过大,从而导致膨胀不好维护的问题。在spring2.5中开始支持:@Component、@Repository、@Service、@Controller等注解定义bean。
如果你有看过这些注解的源码的话,就会惊奇得发现:其实后三种注解也是@Component。
@Component系列注解的出现,给我们带来了极大的便利。我们不需要像以前那样在bean.xml文件中配置bean了,现在只用在类上加Component、Repository、Service、Controller,这四种注解中的任意一种,就能轻松完成bean的定义。
@Service public class PersonService { public String get() { return "data"; } }其实,这四种注解在功能上没有特别的区别,不过在业界有个不成文的约定:
Controller 一般用在控制层 Service 一般用在业务层 Repository 一般用在数据层 Component 一般用在公共组件上太棒了,简直一下子解放了我们的双手。
不过,需要特别注意的是,通过这种@Component扫描注解的方式定义bean的前提是:需要先配置扫描路径。
目前常用的配置扫描路径的方式如下:
在applicationContext.xml文件中使用标签。例如:
<context:component-scan base-package="com.sue.cache" />很赞哦!(5)