JavaWeb框架 - Spring注解部分:

Spring注解部分:

  1. IOC部分的详解:
    • @ComponentScan() 注解:

      • @ComponentScan value:指定要扫描的包

      • excludeFilters = Filter[] :指定扫描的时候按照什么规则排除那些组件

      • includeFilters = Filter[] :指定扫描的时候只需要包含哪些组件

      • 高级使用特性:Filter的使用:使用自定义的TypeFilter 按照一定的类型 进行注解的扫描

        @ComponentScan(value = "com.spring", excludeFilters = {
                @ComponentScan.Filter(type = FilterType.CUSTOM ,classes = {MyTypeFilter.class})
        })
        
        public enum FilterType {
        	ANNOTATION,//默认的就是使用注解的类型进行过滤
        	ASSIGNABLE_TYPE,// 按照给定的类型;
        	ASPECTJ,// 使用ASPECTJ表达式
        	REGEX,	//使用正则指定
        	CUSTOM// 这里是使用给定的过滤规则进行注解的扫描
        }
        
        
        public class MyTypeFilter implements TypeFilter {
        
        	/**
        	 * metadataReader:读取到的当前正在扫描的类的信息
        	 * metadataReaderFactory:可以获取到其他任何类信息的
        	 */
        	@Override
        	public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)
        			throws IOException {
        		// TODO Auto-generated method stub
        		//获取当前类注解的信息
        		AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
        		//获取当前正在扫描的类的类信息
        		ClassMetadata classMetadata = metadataReader.getClassMetadata();
        		//获取当前类资源(类的路径)
        		Resource resource = metadataReader.getResource();	
        		String className = classMetadata.getClassName();
        		System.out.println("--->"+className);
        		if(className.contains("er")){// 只有类名包含er的才进行扫描
        			return true;
        		}
        		return false;
        	}
        }
        
    • @Scope() 注解的使用:

      • scope:详解:

        • prototype:多实例的:ioc容器启动 并不会去调用方法创建对象放在容器中而是每次获取的时候才会调用方法创建对象;@Scope("prototype") 和 在xml中的bean标签中的scope属性是一致的<bean id="person" class="com.spring.entities.Person" scope="prototype" lazy-init="true">
        • singleton:单实例的(默认值):ioc容器启动会调用方法创建对象放到ioc容器中在容器创建的过程中就会进行bean的实例化 以后每次获取就是直接从容器(map.get())中拿
        • request:同一次请求创建一个实例
        • session:同一个session创建一个实例
      • 懒加载: 懒加载:容器启动不创建对象。第一次使用(获取)Bean创建对象,并初始化;

        • 单实例bean:默认在容器启动的时候创建对象
    • 指定bean的初始化方法 和 销毁方法的方式:方法中不能有参数 但是可以抛出异常

      • 在xml配置文件中指定bean标签的 <bean id="person" class="com.spring.entities.Person" init-method="" destroy-method="">

      • 第二种方式就是 在@bean 注解中指定 init method 和 destroy method

        @Bean(initMethod = "init", destroyMethod = "destroy")
        public Car car(){
           return new Car();
        }
        
      • 第三种方法使用@PostConstruct @PreDestroy注解

        @PostConstruct //方法中不能有参数 但是能有异常
        public void init() throws RuntimeException{
            System.out.println("car init....");
        }
        @PreDestroy
        public void destroy(){
            System.out.println("car destroy ....");
        }
        
      • 第四种方式: 实现InitializingBean 接口 进行初始化方法实现 afterPropertiesSet() 实现销毁方法的接口就是disposablebean接口 实现destroy()方法

        public class Cat implements InitializingBean, DisposableBean {
            public Cat(){
                System.out.println("new cat");
            }
            @Override
            public void destroy() throws Exception {
                System.out.println(" cat dead.... DisposableBean");
            }
            @Override
            public void afterPropertiesSet() throws Exception {
                System.out.println("cat born... afterPropertiesSet");
            }
        }
        
    • Spring 中工厂类的使用:implements FactoryBean<T>

      public class MyFactoryBean implements FactoryBean<Color> {
          // 创建实例
          @Override
          public Color getObject() throws Exception {
              return new Color();
          }
          // 返回的是bean的class
          @Override
          public Class<?> getObjectType() {
              return Color.class;
          }
          // 要是返回的是true表示的是单例
          @Override
          public boolean isSingleton() {
              return true;
          }
      }
      
      • 需要注意的一点:

         // 使用这样的方式创建出来的其实是color类型的不是工厂 所以传入的类型也是 color类型不是 工厂类型
        Object myFactoryBean = annoBeans.getBean("factoryBean");
        Object myRealFactoryBean = annoBeans.getBean("&factoryBean");//这样才能获取到工厂的实例
        
    • BeanPostProcessor的使用: implements BeanPostProcessor

      @Component// 使用的时候需要也是一个组件需要加入到容器中
      public class MyBeanPostProcessor implements BeanPostProcessor {
          // 初始化之前的后置处理
          @Override
          public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
              System.out.println(beanName+"postProcessBeforeInitialization--->"+bean);
              return bean;
          }
          // 初始化之后的后置处理
          @Override
          public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
              System.out.println(beanName+"postProcessAfterInitialization--->"+bean);
              return bean;
          }
      }
      
      • bean的生命周期:
        在这里插入图片描述
    • 属性注入相关的注解:

      • @value:
        @Value("张三")	//1、基本数值
        private String name;
        @Value("#{20-2}") //2、可以写SpEL; #{}
        private Integer age;
        @Value("${person.nickName}") 	//3、可以写${};取出配置文件【properties】中的值(在运行环境变量里面的值)
        private String nickName;  
        
    • 自动注入相关的注解:

      • @Autowired自动注入:默认优先按照类型去容器中找对应的组件:applicationContext.getBean(XXXclass);找到就赋值 如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找

      • @Qualifier():使用@Qualifier指定需要装配的组件的id,而不是使用属性名自动装配默认一定要将属性赋值好,没有就会报错可以使用@Autowired(required=false);

      • @Primary:让Spring进行自动装配的时候,默认使用首选的bean 也可以继续使用@Qualifier指定需要装配的bean的名字

      • @Resource:可以和@Autowired一样实现自动装配功能;默认是按照组件名称进行装配的(相当于 Autowired + Qualifier)没有能支持@Primary功能没有支持@Autowired(reqiured=false);

      • @Inject:需要导入javax.inject的包,和Autowired的功能一样。、没有required=false的功能 @Autowired:Spring定义的; @Resource、@Inject都是java规范

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上山打卤面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值