一剂公、模式注解與裝配
用于聲明類在應(yīng)用中的角色蜕煌。舉例如下:
注解 | 說(shuō)明 |
---|---|
@Component | 通用注解,聲明一個(gè)普通bean |
@Controller | 聲明web層角色 |
@Service | 聲明服務(wù)層角色 |
@Repository | 聲明dao層數(shù)據(jù)倉(cāng)儲(chǔ)角色 |
@Configuration | 聲明配置類 |
添加模式注解的類如何進(jìn)行裝配诬留?有xml和注解兩種方法:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!--注解支持-->
<context:annotation-config />
<!--掃描包范圍-->
<context:component-scan base-package="com.xx" />
</beans>
@Configuration
@ComponentScan(basePackages = "com.xx")
public class springConfig {
}
二斜纪、@Enable模塊裝配
指一系列具有相同領(lǐng)域功能的組件集合贫母。 舉例如下:
模塊注解 | 功能說(shuō)明 |
---|---|
@EnableWebMvc | web mvc模塊 |
@EnableTransactionManagement | 事務(wù)管理模塊 |
@EnableCaching | 緩存模塊 |
@EnableAsync | 異步模塊 |
@EnableMBeanExport | JMX模塊 |
@enable*注解如何使用,我們參考@EnableAsync源碼實(shí)現(xiàn)看一下
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({AsyncConfigurationSelector.class})
public @interface EnableAsync {
中間代碼......
}
public class AsyncConfigurationSelector extends AdviceModeImportSelector<EnableAsync> {
private static final String ASYNC_EXECUTION_ASPECT_CONFIGURATION_CLASS_NAME = "org.springframework.scheduling.aspectj.AspectJAsyncConfiguration";
public AsyncConfigurationSelector() {}
public String[] selectImports(AdviceMode adviceMode) {
中間代碼......
}
}
public abstract class AdviceModeImportSelector<A extends Annotation> implements ImportSelector {
中間代碼......
}
public interface ImportSelector {
String[] selectImports(AnnotationMetadata var1);
}
通過(guò)以上代碼得知盒刚,關(guān)鍵是通過(guò)實(shí)現(xiàn)ImportSelector接口來(lái)實(shí)現(xiàn)的腺劣。下面模仿源碼自定義一個(gè)@Ebable模塊。
public class Hello1 {
}
public class Hello2 {
}
public class EnableHello implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{Hello1.class.getName()};
}
}
@SpringBootApplication
@Import(EnableHello.class)
public class DemoApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(DemoApplication.class, args);
System.out.println(context.getBean(Hello1.class));
System.out.println(context.getBean(Hello2.class));
}
}