SpringIOC---注解开发

目录

1.启动注解功能

2.bean的定义

3.bean的作用域

4.bean的生命周期

5.加载第三方资源 

6.bean的非引用类型属性注入

7.bean的引用类型属性注入①

8.bean的引用类型属性注入②

9.加载properties文件

10.纯注解格式

11.bean加载控制

12.自定义组件过滤器

13.自定义导入器 

14.自定义注册器

1.启动注解功能

  • 启动注解扫描,加载类中配置的注解项

说明:

  • 在进行包所扫描时,会对配置的包及其子包中所有文件进行扫描
  • 扫描过程是以文件夹递归迭代的形式进行的
  • 扫描过程仅读取合法的java文件
  • 扫描时仅读取spring可识别的注解
  • 扫描结束后会将可识别的有效注解转化为spring对应的自愿加入IOC容器

注意:

  • 无论是注解格式还是xml配置格式,最终都是将资源加载到IOC容器中,差别仅仅时数据读取方式不同
  • 从加载效率上说注解优于xml配置文件

2.bean的定义

  • 名称:@Component @Controller @Service @Repository
  • 类型:类注解
  • 位置:类定义上方
  • 作用:设置该类为spring管理的bean
  • 格式:
    @Component
    public class ClassName(){
        ...
    }

说明 :

  • @Controller @Service @Repository是@Component的衍生注解,功能同@Component一样

相关属性:

  • value(默认为类名的首字母小写):定义bean的访问id。

3.bean的作用域

  • 名称:@Scope
  • 类型:类注解
  • 位置:类定义上方
  • 作用:设置该类为bean对应的scope属性
  • 格式
    @Scope
    public class ClassName(){
        ...
    }

相关属性:

  • value(默认为singleton,单例对象):定义bean的作用域。

4.bean的生命周期

  • 名称:@PostConstruct(初始化方法)  @preDestroy(销毁方法)
  • 类型:方法注解
  • 位置:方法定义上方
  • 作用:设置该方法为bean对应的声明周期方法
  • 格式:
    @PostConstruct
    public void init(){
        System.out.println("init...");
    }

5.加载第三方资源 

  • 名称:@Bean
  • 类型:方法注解
  • 位置:方法定义上方
  • 作用:设置该方法的返回值为spring管理的bean
  • 格式:
    @Bean("dataSource")
    public DruidDataSource createDataSource(){
        return ...;
    }

    说明 :

  • 因为第三方bean无法在其源码上进行修改,使用@bean解决第三方bean的引入问题
  • 该注解用于替代xml配置中的静态工厂与实例工厂创建bean,不区分方法是静态或非静态
  • @Bean所在的类必须被spring扫描加载,否则该注解无法生效

相关属性:

  • value(默认 方法的名字作为组件的id):定义bean的访问id

6.bean的非引用类型属性注入

  • 名称:@Value
  • 类型:属性注解、方法注解
  • 位置:属性定义上方、方法定义上方
  • 作用:设置对应属性的值或对方法进行传参
  • 格式:
    @Value("${jdbc.username}")
    private Strign username;

 说明:

  • value值仅支持非引用类型数据,赋值时对方法的所有参数全部赋值
  • value值仅支持读取properties文件中的属性值,通过类属性将properties中数据传入类中
  • value支持SqEL
  • @Value注解如果添加到属性上方,可以省略set方法(set方法的目的是为属性赋值)

相关属性:

  • value(默认):定义对应的属性值或参数值

7.bean的引用类型属性注入①

  • 名称:@Autowired ,@Qualifier
  • 类型:属性注解、方法注解
  • 位置:属性定义上方、方法定义上方
  • 作用:设置对应属性的对象或对方法进行引用类型传参
  • 格式
    @Autowired(required = false)
    @Qualifier("userDao")
    private UserDao userDao;

    说明

    • @Autowired默认按照类型装配,当找到多个相同类型的对象,默认优先获取id相同的对象。指定@Qualifier后可以指定自动装配的bean的id

    • @Autowired注解属性required:定义该属性是否允许为null,默认required为true,其意义是当某个属性被@Autowired注解后,其属性必须要被赋值。

8.bean的引用类型属性注入②

  • 名称:@Primary
  • 类型:类注解
  • 位置:类定义上方
  • 作用:设置类对应的bean按类型装配时优先装配
  • 格式
    @Primary
    public class ClassName(){
        ...
    }

    注意:@Autowired默认按类型装配,当出现相同类型的bean,使用@Primary提高按类型自动装配的优先级设置无效

9.加载properties文件

  • 名称:@PropertySource
  • 类型:类注解
  • 位置:类定义上方
  • 作用:加载properties文件中的属性值
  • 格式
    @PropertySource("classpath:filename.properties")
    public class ClassName{
    
        @Value("${userName}")
        private String userName;
    }

    说明:

    • 不支持*通配格式,一旦加载,所有的spring控制的bean中均可使用对应属性值

    • value:设置加载的properties文件名

    • ignoreResourceNotFound:如果资源未找到,是否忽略,默认是false。

10.纯注解格式

  • 名称:@Configuration,@ComponentScan
  • 类型:类注解
  • 位置:类定义上方
  • 作用:设置当前类为spring核心配置加载类,用于代替xml文件
  • 格式
    @Configuration
    @ComponentScan("scanPackageName")
    public class SpringConfig{
    
    }

说明:

@Lazy
public class ClassName{
    ...
}

        核心配置类用于替换spring核心配置文件,此类可以设置空的,不设置变量与属性

        bean扫描工作使用注解@ComponentScan替代,其中括号里边需要标明需要扫描包的路径

注意:

当使用纯注解格式加载对象时,我们需要使用AnnotationConfigApplicationContext.

ApplicationContext ioc=new AnntationConfigApplicationContext(SpringConfig.Class);

11.bean加载控制

  • 名称:@Lazy
  • 类型:类注解,方法注解
  • 位置:bean定义的位置(类上或方法上)
  • 作用:控制bean的加载时机,使其延迟加载
  • 格式
@Lazy
public class ClassName{
    ...
}

说明:正常单例对象是在容器创建的时候就创建了该对象,但是如果我们假如暂时并不使用这个对象,大量的创建对象会占用电脑的内存,拖延程序运行的速度,所以我们可以使用@Lazy这个注解标注该单例对象,效果就是在容器创建的时候不在创建该对象,减少无用内存的占用,可以使其在获取该对象的时候才创建该对象,达到了一个多例对象的效果,但是其本质还是单例对象。

12.自定义组件过滤器

  • 名称:TypeFilter
  • 类型:接口
  • 作用:自定义类型过滤器
  • 格式
    public class MyTypeFilter implements TypeFilter {
        @Override
        public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
            ClassMetadata cm=metadataReader.getClassMetadata();
            String name=cm.getClassName();
            if(name.equals("com.bukaedu.StudentDao")){
                return false;
            }
            return false;
        }
    }

13.自定义导入器 

  • 名称:ImportSelector
  • 类型:接口
  • 作用:自定义bean导入器
  • 格式
public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[]{"com.bukadeu.dao.StudentDao"};
    }
}

14.自定义注册器

  • 名称:ImprotBeanDefinitionRegistrar
  • 类型:接口
  • 作用:自定义bean定义注册器
  • 格式
    public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
        @Override
        public void registerBeanDefinitions(AnnotationMetadata icm, BeanDefinitionRegistry r) {
            ClassPathBeanDefinitionScanner sc=new ClassPathBeanDefinitionScanner(r,false);
            TypeFilter tf=new TypeFilter() {
                @Override
                public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
                    return true;
                }
            };
            sc.addIncludeFilter(tf);
            sc.scan("com.bukaedu");
        }

你可能感兴趣的:(Spring框架,spring,java)