1. 程式人生 > >Spring註解驅動開發之IOC

Spring註解驅動開發之IOC

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 public
Student 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=new
AnnotationConfigApplicationContext(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