一、configuration注解的作用
在Spring框架中,configuration注解被广泛用于定义配置类,用来取代传统的XML配置文件。同时,这个注解也可以在一个类中定义多个@Bean注解的方法,对这些方法进行统一管理。
配置类中的每个@Bean方法都会在Spring容器中生成一个bean实例,并且这些实例会被自动注入到需要它们的地方,例如其他的@autowired注解的成员变量。
二、注解configuration作用
用@Configuration注解的类,等价于XML中配置spring容器的
事实上,在内部实现中,@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。