Spring框架Bean配置JAVA类定义方案详解
in 编程SpringJAVA with 0 comment

Spring框架Bean配置JAVA类定义方案详解

in 编程SpringJAVA with 0 comment

Spring框架还提供了JAVA类定义的方式进行Bean配置,该方案可以完全抛弃XML配置文件,同样也可以与XML配置文件组合实现更加复杂的场景。

Spring5.jpg

配置方案

无论使用纯XML配置还是注解配置都需要配置Spring的指定配置文件并在web.xml中指定
而基于JAVA类定义Bean配置,是可以完全抛弃XML配置文件
基于JAVA类如何定义Bean,具体步骤如下:

  1. 使用@Configuration注解需要作为配置的类,表示该类将定义Bean的元数据
  2. 使用@bean注解相应的方法,方法名默认是Bean的名称,方法返回值是Bean对象
  3. 通过AnnotationConfigApplicationContext或子类进行加载基于JAVA类的配置

米虫坦言,实际商用应用中该方案不多见,不太利于代码阅读与维护,至于使用JAVA类定义和XML配置组合更是找不痛快,不过或许有非常复杂的场景我还没有碰到。

JAVA类定义配置案例

配置类定义

//注解在类的上方
@Configuration
public class MebugsConfig 
{
    //注解在方法的上方
    //等效<bean id="user" class="com.mebugs.User"/>
    //注解的方法不能是private、final、static
    @bean
    public User user() 
    {
        User user = new UserImpl();
        return user;
    }
}

取用Bean

public static void main(String[] args) 
{
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MebugsConfig.class);
    ctx.getbean("user");
}

配置类作为Bean

通过@Configuration注解的类将被作为配置类使用。
使用@Configuration注解的类本身也是一个Bean,使用方式见下方

//注解在类的上方
//Configuration中的参数值即为该Bean的名称
@Configuration("meconf")
public class MebugsConfig 
{
    //略
}

@bean参数

通过@bean注解配置类中的相应方法,方法名默认就是Bean名,方法返回值是Bean对象
该注解可以定义了Spring IOC容器如何实例化、自动装配、初始化Bean逻辑等

//name是Bean名可以为多个
//autowire为是否自动装配,默认值为NO
//initMethod为Bean的初始化方法
//destoryMethod为Bean的销毁方法
@bean(name={"user","people"},autowire=Autowire.NO,initMethod="",destroyMethod="")
public User user() 
{
    User user = new UserImpl();
    return user;
}

JAVA类定义组合XML

基于JAVA类定义的配置方式不是为了完全替代基于XML方式的配置
两者可以结合使用,因此存在两种结合使用方式

  1. 在基于JAVA方式的配置类中引入基于XML方式的配置文件
  2. 在基于XML方式的配置文件中中引入基于JAVA方式的配置

存在XML配置mebugs.sevice.xml

<bean id="user" class="com.mebugs.User"/>

在配置类中引入

//注解在类的上方
@Configuration("meconf")
//使用@ImportResource导入了XML的配置文件
@ImportResource("classpath:/mebugs.sevice.xml")
public class MebugsConfig 
{
    //略
}

同理将配置类配置到XML中去

XML的配置文件当中将JAVA的配置类当中Bean来声明,必须得配置解驱动支持

<!-- 开启注解驱动支持 -->
<context:annotation-config/>
<bean id="meconf" class=“com.mebugs.MebugsConfig"/>

获取配置类

public static void main(String[] args) 
{
    String configLocations[] = {"classpath:/mebugs.sevice.xml"};
    ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocations);
}

多配置类场景

构造函数分别加载

ApplicationContext ctx1 = new AnnotationConfigApplicationContext(MebugsConfig.class);
ApplicationContext ctx2 = new AnnotationConfigApplicationContext(MeConfig.class);
ApplicationContext ctx3 = new AnnotationConfigApplicationContext(BugsConfig.class);

编码统一注册

ApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(MebugsConfig.class);
ctx.register(MeConfig.class);
ctx.register(BugsConfig.class);
//refresh刷新容器以应用这些配置
ctx.refresh();

引入配置

//建立一个基础配置类
@Configuration
//引入其他配置类
@Import(MebugsConfig.class)
@Import(MeConfig.class)
@Import(BugsConfig.class)
public class BaseConfig 
{
    //略
}
//直接构造基础配置类
ApplicationContext ctx = new AnnotationConfigApplicationContext(BaseConfig.class);

结尾说明

米虫再次坦言,日常的开发中我们主要是使用XML配置和注解配置方式结合的开发方式
一般不推荐使用基于JAVA类的配置方式
对于实例化Bean的逻辑比较复杂,或许比较适合用基于JAVA类配置的方式

Responses