-  @Target(value={METHOD,ANNOTATION_TYPE}) @Retention(value=RUNTIME) @Documented public @interface Bean Indicates that a method produces a bean to be managed by the Spring container.OverviewThe names and semantics of the attributes to this annotation are intentionally similar to those of the <bean/>element in the Spring XML schema. For example:@Bean public MyBean myBean() { // instantiate and configure MyBean obj return obj; }Bean NamesWhile a nameattribute is available, the default strategy for determining the name of a bean is to use the name of the@Beanmethod. This is convenient and intuitive, but if explicit naming is desired, thenameattribute may be used. Also note thatnameaccepts an array of Strings. This is in order to allow for specifying multiple names (i.e., aliases) for a single bean.@Bean(name={"b1","b2"}) // bean available as 'b1' and 'b2', but not 'myBean' public MyBean myBean() { // instantiate and configure MyBean obj return obj; }Scope, DependsOn, Primary, and LazyNote that the @Beanannotation does not provide attributes for scope, depends-on, primary, or lazy. Rather, it should be used in conjunction with@Scope,@DependsOn,@Primary, and@Lazyannotations to achieve those semantics. For example:@Bean @Scope("prototype") public MyBean myBean() { // instantiate and configure MyBean obj return obj; }@BeanMethods in@ConfigurationClassesTypically, @Beanmethods are declared within@Configurationclasses. In this case, bean methods may reference other@Beanmethods in the same class by calling them directly. This ensures that references between beans are strongly typed and navigable. Such so-called 'inter-bean references' are guaranteed to respect scoping and AOP semantics, just likegetBean()lookups would. These are the semantics known from the original 'Spring JavaConfig' project which require CGLIB subclassing of each such configuration class at runtime. As a consequence,@Configurationclasses and their factory methods must not be marked as final or private in this mode. For example:@Configuration public class AppConfig { @Bean public FooService fooService() { return new FooService(fooRepository()); } @Bean public FooRepository fooRepository() { return new JdbcFooRepository(dataSource()); } // ... }@BeanLite Mode@Beanmethods may also be declared within classes that are not annotated with@Configuration. For example, bean methods may be declared in a@Componentclass or even in a plain old class. In such cases, a@Beanmethod will get processed in a so-called 'lite' mode.Bean methods in lite mode will be treated as plain factory methods by the container (similar to factory-methoddeclarations in XML), with scoping and lifecycle callbacks properly applied. The containing class remains unmodified in this case, and there are no unusual constraints for the containing class or the factory methods.In contrast to the semantics for bean methods in @Configurationclasses, 'inter-bean references' are not supported in lite mode. Instead, when one@Bean-method invokes another@Bean-method in lite mode, the invocation is a standard Java method invocation; Spring does not intercept the invocation via a CGLIB proxy. This is analogous to inter-@Transactionalmethod calls where in proxy mode, Spring does not intercept the invocation — Spring does so only in AspectJ mode.For example: @Component public class Calculator { public int sum(int a, int b) { return a+b; } @Bean public MyBean myBean() { return new MyBean(); } }BootstrappingSee @ ConfigurationJavadoc for further details including how to bootstrap the container usingAnnotationConfigApplicationContextand friends.BeanFactoryPostProcessor-returning@BeanmethodsSpecial consideration must be taken for @Beanmethods that return SpringBeanFactoryPostProcessor(BFPP) types. BecauseBFPPobjects must be instantiated very early in the container lifecycle, they can interfere with processing of annotations such as@Autowired,@Value, and@PostConstructwithin@Configurationclasses. To avoid these lifecycle issues, markBFPP-returning@Beanmethods asstatic. For example:@Bean public static PropertyPlaceholderConfigurer ppc() { // instantiate, configure and return ppc ... }By marking this method asstatic, it can be invoked without causing instantiation of its declaring@Configurationclass, thus avoiding the above-mentioned lifecycle conflicts. Note however thatstatic@Beanmethods will not be enhanced for scoping and AOP semantics as mentioned above. This works out inBFPPcases, as they are not typically referenced by other@Beanmethods. As a reminder, a WARN-level log message will be issued for any non-static@Beanmethods having a return type assignable toBeanFactoryPostProcessor.
-  
    -  Optional Element SummaryOptional Elements Modifier and Type Optional Element and Description AutowireautowireAre dependencies to be injected via convention-based autowiring by name or type?StringdestroyMethodThe optional name of a method to call on the bean instance upon closing the application context, for example aclose()method on a JDBCDataSourceimplementation, or a HibernateSessionFactoryobject.StringinitMethodThe optional name of a method to call on the bean instance during initialization.String[]nameThe name of this bean, or if plural, aliases for this bean.
 
-  
-  
    -  Element Detail-  namepublic abstract String[] name The name of this bean, or if plural, aliases for this bean. If left unspecified the name of the bean is the name of the annotated method. If specified, the method name is ignored.- 
         
          Default:
         
         
- {}
 
 
-  
 -  
      -  autowirepublic abstract Autowire autowire Are dependencies to be injected via convention-based autowiring by name or type?- 
         
          Default:
         
         
- org.springframework.beans.factory.annotation.Autowire.NO
 
 
-  
 -  
      -  initMethodpublic abstract String initMethod The optional name of a method to call on the bean instance during initialization. Not commonly used, given that the method may be called programmatically directly within the body of a Bean-annotated method.The default value is "", indicating no init method to be called.- 
         
          Default:
         
         
- ""
 
 
-  
 -  
      -  destroyMethodpublic abstract String destroyMethod The optional name of a method to call on the bean instance upon closing the application context, for example aclose()method on a JDBCDataSourceimplementation, or a HibernateSessionFactoryobject. The method must have no arguments but may throw any exception.As a convenience to the user, the container will attempt to infer a destroy method against an object returned from the @Beanmethod. For example, given an@Beanmethod returning an Apache Commons DBCPBasicDataSource, the container will notice theclose()method available on that object and automatically register it as thedestroyMethod. This 'destroy method inference' is currently limited to detecting only public, no-arg methods named 'close' or 'shutdown'. The method may be declared at any level of the inheritance hierarchy and will be detected regardless of the return type of the@Beanmethod (i.e., detection occurs reflectively against the bean instance itself at creation time).To disable destroy method inference for a particular @Bean, specify an empty string as the value, e.g.@Bean(destroyMethod=""). Note that theDisposableBeanand theCloseable/AutoCloseableinterfaces will nevertheless get detected and the corresponding destroy/close method invoked.Note: Only invoked on beans whose lifecycle is under the full control of the factory, which is always the case for singletons but not guaranteed for any other scope. - 
         
          See Also:
         
         
- 
          ConfigurableApplicationContext.close()
 - 
         
          Default:
         
         
- "(inferred)
 
- 
          
 
-  
 
-  
官方地址:
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/Bean.html
http://docs.spring.io/spring-javaconfig/docs/1.0.0.M4/reference/html/ch02s02.html
Annotation Type Import
-  @Target(value=TYPE) @Retention(value=RUNTIME) @Documented public @interface Import Indicates one or more@Configurationclasses to import.Provides functionality equivalent to the <import/>element in Spring XML. Only supported for classes annotated with@Configurationor declaring at least one@Beanmethod, as well asImportSelectorandImportBeanDefinitionRegistrarimplementations.@Beandefinitions declared in imported@Configurationclasses should be accessed by using@Autowiredinjection. Either the bean itself can be autowired, or the configuration class instance declaring the bean can be autowired. The latter approach allows for explicit, IDE-friendly navigation between@Configurationclass methods.May be declared at the class level or as a meta-annotation. If XML or other non- @Configurationbean definition resources need to be imported, use@ImportResource官方地址:http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Import.html Annotation Type Configuration-  @Target(value=TYPE) @Retention(value=RUNTIME) @Documented @Component public @interface Configuration Indicates that a class declares one or more@Beanmethods and may be processed by the Spring container to generate bean definitions and service requests for those beans at runtime, for example:@Configuration public class AppConfig { @Bean public MyBean myBean() { // instantiate, configure and return bean ... } }Bootstrapping@ConfigurationclassesViaAnnotationConfigApplicationContext@Configurationclasses are typically bootstrapped using eitherAnnotationConfigApplicationContextor its web-capable variant,AnnotationConfigWebApplicationContext. A simple example with the former follows:AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.register(AppConfig.class); ctx.refresh(); MyBean myBean = ctx.getBean(MyBean.class); // use myBean ...SeeAnnotationConfigApplicationContextJavadoc for further details and seeAnnotationConfigWebApplicationContextforweb.xmlconfiguration instructions.Via Spring<beans>XMLAs an alternative to registering @Configurationclasses directly against anAnnotationConfigApplicationContext,@Configurationclasses may be declared as normal<bean>definitions within Spring XML files:
 In the example above,<beans> <context:annotation-config/> <bean class="com.acme.AppConfig"/> </beans><context:annotation-config/>is required in order to enableConfigurationClassPostProcessorand other annotation-related post processors that facilitate handling@Configurationclasses.Via component scanning@Configurationis meta-annotated with@Component, therefore@Configurationclasses are candidates for component scanning (typically using Spring XML's<context:component-scan/>element) and therefore may also take advantage of@Autowired/@Injectat the field and method level (but not at the constructor level).@Configurationclasses may not only be bootstrapped using component scanning, but may also themselves configure component scanning using the@ComponentScanannotation:@Configuration @ComponentScan("com.acme.app.services") public class AppConfig { // various @Bean definitions ... }See@ComponentScanJavadoc for details.Working with externalized valuesUsing theExternalized values may be looked up by injecting the SpringEnvironmentAPIEnvironmentinto a@Configurationclass using the@Autowiredor the@Injectannotation:@Configuration public class AppConfig { @Inject Environment env; @Bean public MyBean myBean() { MyBean myBean = new MyBean(); myBean.setName(env.getProperty("bean.name")); return myBean; } }Properties resolved through theEnvironmentreside in one or more "property source" objects, and@Configurationclasses may contribute property sources to theEnvironmentobject using the@PropertySourcesannotation:@Configuration @PropertySource("classpath:/com/acme/app.properties") public class AppConfig { @Inject Environment env; @Bean public MyBean myBean() { return new MyBean(env.getProperty("bean.name")); } }SeeEnvironmentand@PropertySourceJavadoc for further details.Using theExternalized values may be 'wired into'@Valueannotation@Configurationclasses using the@Valueannotation:@Configuration @PropertySource("classpath:/com/acme/app.properties") public class AppConfig { @Value("${bean.name}") String beanName; @Bean public MyBean myBean() { return new MyBean(beanName); } }This approach is most useful when using Spring'sPropertySourcesPlaceholderConfigurer, usually enabled via XML with<context:property-placeholder/>. See the section below on composing@Configurationclasses with Spring XML using@ImportResource, see@ValueJavadoc, and see@BeanJavadoc for details on working withBeanFactoryPostProcessortypes such asPropertySourcesPlaceholderConfigurer.Composing@ConfigurationclassesWith the@Importannotation@Configurationclasses may be composed using the@Importannotation, not unlike the way that<import>works in Spring XML. Because@Configurationobjects are managed as Spring beans within the container, imported configurations may be injected using@Autowiredor@Inject:@Configuration public class DatabaseConfig { @Bean public DataSource dataSource() { // instantiate, configure and return DataSource } } @Configuration @Import(DatabaseConfig.class) public class AppConfig { @Inject DatabaseConfig dataConfig; @Bean public MyBean myBean() { // reference the dataSource() bean method return new MyBean(dataConfig.dataSource()); } }Now bothAppConfigand the importedDatabaseConfigcan be bootstrapped by registering onlyAppConfigagainst the Spring context:new AnnotationConfigApplicationContext(AppConfig.class); With the@Profileannotation@Configurationclasses may be marked with the@Profileannotation to indicate they should be processed only if a given profile or profiles are active:@Profile("embedded") @Configuration public class EmbeddedDatabaseConfig { @Bean public DataSource dataSource() { // instantiate, configure and return embedded DataSource } } @Profile("production") @Configuration public class ProductionDatabaseConfig { @Bean public DataSource dataSource() { // instantiate, configure and return production DataSource } }See@ProfileandEnvironmentJavadoc for further details.With Spring XML using theAs mentioned above,@ImportResourceannotation@Configurationclasses may be declared as regular Spring<bean>definitions within Spring XML files. It is also possible to import Spring XML configuration files into@Configurationclasses using the@ImportResourceannotation. Bean definitions imported from XML can be injected using@Autowiredor@Import:@Configuration @ImportResource("classpath:/com/acme/database-config.xml") public class AppConfig { @Inject DataSource dataSource; // from XML @Bean public MyBean myBean() { // inject the XML-defined dataSource bean return new MyBean(this.dataSource); } }With nested@Configurationclasses@Configurationclasses may be nested within one another as follows:@Configuration public class AppConfig { @Inject DataSource dataSource; @Bean public MyBean myBean() { return new MyBean(dataSource); } @Configuration static class DatabaseConfig { @Bean DataSource dataSource() { return new EmbeddedDatabaseBuilder().build(); } } }When bootstrapping such an arrangement, onlyAppConfigneed be registered against the application context. By virtue of being a nested@Configurationclass,DatabaseConfigwill be registered automatically. This avoids the need to use an@Importannotation when the relationship betweenAppConfigDatabaseConfigis already implicitly clear.Note also that nested @Configurationclasses can be used to good effect with the@Profileannotation to provide two options of the same bean to the enclosing@Configurationclass.Configuring lazy initializationBy default, @Beanmethods will be eagerly instantiated at container bootstrap time. To avoid this,@Configurationmay be used in conjunction with the@Lazyannotation to indicate that all@Beanmethods declared within the class are by default lazily initialized. Note that@Lazymay be used on individual@Beanmethods as well.Testing support forThe Spring TestContext framework available in the@Configurationclassesspring-testmodule provides the@ContextConfigurationannotation, which as of Spring 3.1 can accept an array of@ConfigurationClassobjects:@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes={AppConfig.class, DatabaseConfig.class}) public class MyTests { @Autowired MyBean myBean; @Autowired DataSource dataSource; @Test public void test() { // assertions against myBean ... } }See TestContext framework reference documentation for details.Enabling built-in Spring features usingSpring features such as asynchronous method execution, scheduled task execution, annotation driven transaction management, and even Spring MVC can be enabled and configured from@Enableannotations@Configurationclasses using their respective "@Enable" annotations. See@EnableAsync,@EnableScheduling,@EnableTransactionManagement,@EnableAspectJAutoProxy, and@EnableWebMvcfor details.Constraints when authoring@Configurationclasses- @Configuration classes must be non-final
- @Configuration classes must be non-local (may not be declared within a method)
- @Configuration classes must have a default/no-arg constructor and may not use @Autowiredconstructor parameters. Any nested configuration classes must bestatic.
 
 官方地址:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/Configuration.html 
-  
 
                   
                   
                   
                   本文详细介绍了 Spring 框架中 @Bean 注解的使用方法,包括如何定义 Bean 的名称、作用域等属性,以及如何在配置类中使用 @Bean 方法来创建和配置 Bean 对象。同时探讨了 @Bean 方法在不同场景下的行为差异。
本文详细介绍了 Spring 框架中 @Bean 注解的使用方法,包括如何定义 Bean 的名称、作用域等属性,以及如何在配置类中使用 @Bean 方法来创建和配置 Bean 对象。同时探讨了 @Bean 方法在不同场景下的行为差异。
           
                     
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
              
             
                   8386
					8386
					
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
            


 
            