标签:reg release let 初始化 selector image src 优先 roo
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)
标签:reg release let 初始化 selector image src 优先 roo
原文地址:https://www.cnblogs.com/yaohuiqin/p/9961900.html