spring 核心注解学习

一、spring 容器继承图

在这里插入图片描述

二、加载spring容器

1、ClassPathXmlApplicationContext
public class ClassPathLoadContainer {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context=new
                ClassPathXmlApplicationContext("application-bean.xml");
        Object obj= context.getBean("user");
        System.out.println(obj);
    }
}
2、FileSystemXmlApplicationContext
public class FileSystemLoadContainer {
    public static void main(String[] args) {
        FileSystemXmlApplicationContext context=new
           FileSystemXmlApplicationContext("D:\\workspace\\springStudy\\springAnnotationStudy\\src\\main\\resources\\application-bean.xml");
        Object obj= context.getBean("user");
        System.out.println(obj);
    }
}
3、AnnotationConfigApplicationContext
@Configuration
public class BeanConfig {
    @Bean
    public Role role(){
        return new Role();
    }
}
public class AnnotationLoadContainer {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context=new
                AnnotationConfigApplicationContext(BeanConfig.class);
        Object obj= context.getBean("role");
        System.out.println(obj);
    }
}

三、核心注解

@Bean

通过@Bean的形式是使用的话, bean的默认名称是方法名,若@Bean(value=“bean的名称”)
那么bean的名称是指定的

@Configuration
public class BeanConfig {
    @Bean(value = "role")
    public Role role(){
        return new Role();
    }
}
@Scope

配置Bean的作用域,在不指定@Scope的情况下,所有的bean都是单实例的bean,而且是饿汉加载(容器启动实例就创建好了)指定@Scope为 prototype 表示为多实例的,而且还是懒汉模式加载(IOC容器启动的时候,并不会创建对象,而是在第一次使用的时候才会创建)

@Scope指定的作用域方法取值
a) singleton 单实例的(默认)
b) prototype 多实例的
c) request 同一次请求
d) session 同一个会话级别

Bean的懒加载@Lazy(主要针对单实例的bean 容器启动的时候,不创建对象,在第一次使用的时候才会创建该对象)

@CompentScan

配置包扫描,此注解需搭配@Controller @Service @Respository @compent这些注解其中之一来实现初始化bean

@Repository
public class Cat {
}
public class CompentScanAnnotationLoadContainer {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context=new
                AnnotationConfigApplicationContext(CompentScanConfig.class);
        System.out.println(context.getBean("cat"));
    }
}

包含用法 includeFilters ,注意,若使用包含的用法,需要把useDefaultFilters属性设置为false(true表示扫描全部的)

@Configuration
@ComponentScan(basePackages = {"com.mlj.indi.scanBean"},includeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION,value = Service.class)
},useDefaultFilters = false)
public class CompentScanConfig {

}
public class CompentScanAnnotationLoadContainer {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context=new
                AnnotationConfigApplicationContext(CompentScanConfig.class);
        System.out.println(context.getBean("cat"));
    }
}

排除用法excludeFilters

@Configuration
@ComponentScan(basePackages = {"com.mlj.indi.scanBean"},excludeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION,value = Service.class)
})
public class CompentScanConfig {

}
@Conditional
public class MljConditional implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        //todo 逻辑判断,返回为true时加载对象
        return false;
    }
}

@Service
@Conditional(value = MljConditional.class)
public class Dog {
}
@Value

通过@Value + @PropertySource来给组件赋值

@Configuration
@PropertySource(value = "classpath:test.properties")
public class BeansLifeConfig {}
@Value("${student.name}")
private String name;
@AutoWired

1、自动装配首先时按照类型进行装配,若在IOC容器中发现了多个相同类型的组件,那么就按照 属性名称来进行装配
2、如需要指定特定的组件来进行装配,我们可以通过使用@Qualifier(“tulingDao”)来指定装配的组件
3、@Resource(JSR250规范)功能和@AutoWired的功能差不多一样,但是不支持@Primary 和@Qualifier的支持
4、@InJect(JSR330规范)需要导入jar包依赖功能和支持@Primary功能 ,但是没有Require=false的功能
5、使用autowired 可以标注在方法上、标注在set方法上、标注在构造方法上、标注在配置类上的入参中

@Profile

通过@Profile注解 来根据环境来激活标识不同的Bean

激活切换环境的方法

​ 方法一:通过运行时jvm参数来切换 -Dspring.profiles.active=test|dev|prod
​ 方法二:通过代码的方式来激活

四、添加组件

@CompentScan

​ 通过@CompentScan +@Controller @Service @Respository @compent

@Bean

​ 通过@Bean的方式来导入组件(适用于导入第三方组件的类)

@Import

​ 通过@Import来导入组件 (导入组件的id为全类名路径)

@Configuration
@Import(value ={Car.class, Person.class})
public class ImportConfig {
}
public class ImportAnnotationLoadContainer {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context=new
                AnnotationConfigApplicationContext(ImportConfig.class);
        //使用@Import加入到容器里的bean在容器中beanName是全类名,故获取时写Person.class
        System.out.println(context.getBean(Person.class));
    }
}

ImportBeanDefinitionRegistrar

public class MljBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata annotationMetadata,
                                        BeanDefinitionRegistry beanDefinitionRegistry) {
        RootBeanDefinition beanDefinition=new RootBeanDefinition(Car.class);
        beanDefinitionRegistry.registerBeanDefinition("car",beanDefinition);
    }
}
@Configuration
@Import(value ={Car.class, Person.class, MljBeanDefinitionRegister.class})
public class ImportConfig {
}
public class ImportAnnotationLoadContainer {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context=new
                AnnotationConfigApplicationContext(ImportConfig.class);
        //使用@Import加入到容器里的bean在容器中beanName是全类名,故获取时写Person.class
        //对于全类名的问题可以使用ImportBeanDefinitionRegistrar来解决
        System.out.println(context.getBean("car"));
    }
}
FacotryBean

通过实现FacotryBean接口来实现注册 组件

public class PersonBeanFactory implements FactoryBean<Person> {
    @Override
    public Person getObject() throws Exception {
        return new Person();
    }

    @Override
    public Class<?> getObjectType() {
        return Person.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}
@Bean
    public PersonBeanFactory personBeanFactory(){
        return new PersonBeanFactory();
    }
public static void main(String[] args) {
        AnnotationConfigApplicationContext context=new
                AnnotationConfigApplicationContext(BeanConfig.class);
        Object obj= context.getBean("personBeanFactory");
        //spring最终会通过反射找到Person
        System.out.println(obj);
    }

五、bean的生命周期

​ 1、通过 InitializingBean和DisposableBean 的二个接口实现bean的初始化以及销毁方法

public class Student implements InitializingBean, DisposableBean {
    @Override
    public void destroy() throws Exception {
        System.out.println("bean 被销毁");
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("bean被初始化");
    }
}

​ 2、通过JSR250规范 提供的注解@PostConstruct 和@ProDestory标注的方法

public class Student  {
    @PreDestroy
    public void destroy() throws Exception {
        System.out.println("bean 被销毁");
    }

    @PostConstruct
    public void afterPropertiesSet() throws Exception {
        System.out.println("bean被初始化");
    }
}

​ 3、通过Spring的BeanPostProcessor的 bean的后置处理器会拦截所有bean创建过程

public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(beanName+"初始化之前");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(beanName+"初始化之后");
        return bean;
    }
}
@Bean
public MyBeanPostProcessor myBeanPostProcessor(){
     return new MyBeanPostProcessor();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值