Spring註解驅動開發之IOC
阿新 • • 發佈:2018-11-21
getprop student type() tco 簡單 erb als com edt
1、最簡單的註解驅動開發實例:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.8.RELEASE</version> </dependency>
public class Student { String name; public String getName() {return name; } public void setName(String name) { this.name = name; } public void print(){ System.out.println("student :" + name); } public Student() { System.out.println("student構造器"); } } @Configuration public class Config { @Bean publicStudent student(){ System.out.println("創建student對象"); Student s = new Student(); s.setName("yaohuiqin"); return s; } } public class Main { public static void main(String[] args) { AnnotationConfigApplicationContext annotationConfigApplicationContext=newAnnotationConfigApplicationContext(Config.class); Student s= (Student) annotationConfigApplicationContext.getBean(Student.class); System.out.println(s.getName()); String[] strings=annotationConfigApplicationContext.getBeanDefinitionNames(); for(String ss:strings){ System.out.println(ss); } } }
2、@ComponentScan註解 自動掃描 @Controller @Service @Repository @Component
FilterType.ANNOTATION:按照註解
FilterType.ASSIGNABLE_TYPE:按照給定的類型
FilterType.CUSTOM :自定義類型
<context:component-scan base-package="com.test.spring"></context:component-scan>
@Configuration @ComponentScan(value = "com.test.spring.config",includeFilters={ @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class), @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes = Service.class) },useDefaultFilters =false) public class Config { }
public class MyTypeFilger implements TypeFilter { /** * * @param metadataReader 掃描到的當前的類的信息 * @param metadataReaderFactory 可以獲取其他類的信息 * @return * @throws IOException */ @Override public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { //獲取當前類的註解的信息 AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata(); //獲取當前掃描類的類型信息 ClassMetadata classMetadata = metadataReader.getClassMetadata(); //獲取當前類的資源的信息 Resource resource = metadataReader.getResource(); String className = classMetadata.getClassName(); System.out.println("測試"+className); if(className.contains("er"))return true; return false; } }
@Configuration
@ComponentScan(value = "com.test.spring.config",includeFilters={
@ComponentScan.Filter(type = FilterType.CUSTOM,classes = MyTypeFilger.class)
},useDefaultFilters =false)
public class config {
}
3、@Scope(value = "singleton")
singleton、prototype、request、session
@Lazy懶加載
4@import(快速給容器導入一個組件)
@Import(value = {MyImportBeanDefinitionRegistrar.class,Dao.class})
value值可以是bean的類,
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { BeanDefinition beanDefinition = new RootBeanDefinition(ByBeanDefinitionRegistrar.class); registry.registerBeanDefinition("ByBeanDefinitionRegistrar123",beanDefinition); } } public class MyImportSelector implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{"com.test.spring.config.Dao","com.test.spring.config.Service"}; } }
5、@conditional使用實例
@Configuration public class config2 { @Conditional(value = Linuxcondition.class) @Bean public Person yaohuiqin(){ System.out.println("創建Person:yaohuiqin對象"); Person s = new Person(); s.setName("yaohuiqin"); return s; } } public class Linuxcondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { ConfigurableListableBeanFactory beanFactory = context.getBeanFactory(); ClassLoader classLoader = context.getClassLoader(); Environment environment = context.getEnvironment(); String currentOs = environment.getProperty("os.name"); System.out.println(currentOs); if(currentOs.contains("Windows"))return true; return false; } }
6、實現FactoryBean接口
public class NextDate implements FactoryBean { @Override public Object getObject() throws Exception { Date date = new Date(); Calendar calendar = new GregorianCalendar(); calendar.setTime(date); calendar.add(Calendar.DATE, 1); date = calendar.getTime(); return date; } @Override public Class<?> getObjectType() { return Date.class; } @Override public boolean isSingleton() { return false; } }
7、指定初始化方法和銷毀方法
@Bean(initMethod = "init",destroyMethod = "destory") 初始化和銷毀方法指定。初始化方法是在對象創建完成並賦完值,則調初始化方法。銷毀方法是在容器銷毀時調用。
@PostConstruct
@PreDestroy
public class MyCat implements InitializingBean,DisposableBean { String name; public MyCat() { System.out.println("MyCat構造器"); } public String getName() { return name; } public void setName(String name) { System.out.println("設置屬性"); this.name = name; } @Override public void afterPropertiesSet() throws Exception { System.out.println("MyCat---InitializingBean----afterPropertiesSet()"); } @Override public void destroy() throws Exception { System.out.println("DisposableBean---DisposableBean---destroy()"); } }
8、BeanPostProcessor接口
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
源碼:
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)
throws BeanCreationException {
populateBean(beanName, mbd, instanceWrapper); //給bean進行屬性賦值
if (exposedObject != null) {
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
}
9、@Value賦值
值,#{},${} #{20-2}
<context:property-placeholder location="jdbc.properties"></context:property-placeholder>
等價於在配置類上寫:@PropertySource( value = "jdbc.properties")
10、自動裝配
@Autowired 優先使用類型去自動裝配,如果存在多個,則將屬性的名字作為id去查找裝配。
指定裝配:
@Qualifier("myDao2")
@Autowired
MyDao myDao3;
裝配時首選裝配:
@Primary
找不到就不裝配 :
@Autowired(required = false)
Spring註解驅動開發之IOC