您的位置:

configuration注解详解

一、configuration注解的作用

在Spring框架中,configuration注解被广泛用于定义配置类,用来取代传统的XML配置文件。同时,这个注解也可以在一个类中定义多个@Bean注解的方法,对这些方法进行统一管理。

配置类中的每个@Bean方法都会在Spring容器中生成一个bean实例,并且这些实例会被自动注入到需要它们的地方,例如其他的@autowired注解的成员变量。

二、注解configuration作用

用@Configuration注解的类,等价于XML中配置spring容器的标签。@Bean注解等价于XML中配置标签。

事实上,在内部实现中,@Configuration注解使用了@Component注解,将这个类的实例交给了Spring容器进行管理。

三、configuration注解什么意思

configuration注解通常用来标识一个Java类为Spring的配置类。在这个类中,我们可以定义一些bean,这些bean将被注册到Spring容器中,供其他地方使用。

除此之外,配置类也可以与其他的@Configuration注解的类共同组成一个更复杂的配置环境。

四、@configuration注解

@Configuration注解可以用在类上,只要有这个注解的类,就被视为Spring配置类,而且可以通过@componentScan自动扫描到。同时,这个注解也可以用在方法上,表示这个方法返回的实例也是需要交给Spring容器管理的。

下面是一个经典的@Configuration注解的使用示例:

@Configuration
public class AppConfig {
    @Bean
    public TransferService transferService() {
        return new TransferServiceImpl();
    }
}

在这里,我们定义了一个TransferService的bean,并通过@Bean注解表示,这个方法的返回值会被自动注册到Spring容器中。注意,这个方法的命名规范也相应的与bean的命名规范有关,例如这里的transferService()方法,自动生成了名字为transferService的bean。

五、configurable注解

@configurable注解不同于之前的@Configuration注解,它的主要作用是自动为一个普通对象进行依赖注入,而不是像@Configuration注解一样,用来标识类。

这个注解通常用来为一些无法交给Spring容器管理的对象进行自动注册、扩展依赖注入的能力。下面是使用@configured注解进行依赖注入的例子:

@Configurable
public class Circle {
    @Autowired
    private Point center;
    
    @Override
    public String toString(){
        return "Circle[" + center + "]";
    }
}

在这里,我们定义了一个普通类Circle,并将这个类标记为@configurable,同时,我们还在这个类中使用了@Autowired注解来对它的私有成员变量进行依赖注入。这个例子说明,使用了@configurable注解之后,我们可以将普通对象当作bean来进行处理。

六、configuration啥意思

configuration实际上代表Java配置类的本质,Java配置类就是负责与Spring容器进行交互的Java类。这个类里面通常会包含一些@Bean注解的方法,每个方法都返回一个在容器中管理的bean实例。

Java配置类主要的作用是解耦,将配置直接写在Java代码中,避免了XML配置太多、易错的问题,同时便于调试与重构。

七、configuration注解不起作用

如果使用@Configuration注解时发现无法识别,可能是因为缺少依赖的原因。应该在pom文件中引入spring-context包,并保证这个包的版本与环境中安装的Spring版本一致。

同时,如果将@Configuration注解用在一个非public的类上,也可能会无法被Spring容器识别。需要将这个类设为public。

八、configuration注解加载顺序

在Spring中,所有的@Configuration注解的类都可以彼此导入、组合使用。在导入时,这些类会以某种顺序被Spring容器加载。

Spring的@Configuration注解加载顺序可以简单归纳为:@Import、@Bean(包括@Bean的初始化函数)、普通@Bean、@Configuration

在这个顺序中,Spring容器首先会加载被@Import注解导入的@Configuration注解类,然后按照@Bean的顺序依次注册每个bean。最后,Spring容器会扫描剩余的@Configuration注解中定义的bean。

九、configuration注解参数

@Configuration注解有一个可选的参数proxyBeanMethods,这个参数的默认值是true。如果将这个参数设为false,Spring就不会为这个配置类生成代理类,这样做可能会提高应用的执行效率。

下面是一个使用proxyBeanMethods参数的例子:

@Configuration(proxyBeanMethods = false)
public class AppConfig {
    @Bean
    public TransferService transferService() {
        return new TransferServiceImpl();
    }
}

十、configuration注解的类怎么调用

Spring的Java配置类可以通过加载到Spring容器中实现被调用。我们可以通过两种方式实现这个过程:

方式一:用AnnotationConfigApplicationContext注册配置类

public static void main(String[] args) {
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
    ctx.register(AppConfig.class);
    ctx.refresh();
    TransferService transferService = ctx.getBean(TransferService.class);
    transferService.transfer();
}

方式二:在web.xml中注册DispatcherServlet,并指定@Configuration注解的类

public class MyWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class[] getRootConfigClasses() {
        return new Class[] { AppConfig.class };
    }
}

这种方式适用于Spring应用是基于Servlet的情况,例如Spring MVC。