本文最后更新于:June 15, 2022 pm
Spring 是目前主流的 Java Web 开发框架,是 Java 世界最为成功的框架。Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。该框架是一个轻量级的开源框架,具有很高的凝聚力和吸引力。Spring 框架不局限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何 Java 应用都可以从 Spring 中受益。Spring 框架还是一个超级粘合平台,除了自己提供功能外,还提供粘合其他技术和框架的能力。
目录
在前面已经说过的注解这里就不再说了,只是记录一下最后一种自定义依赖注入方式的用法。
自定义依赖注入 目标类:
package com.SpringTestAnnotation.TestValue;@Component public class OrderS { }
使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 package com.SpringTestAnnotation.TestValue;import org.springframework.stereotype.Component;@Component public class Per { @OurAnno private OrderS orderS; public void show () { System.out.println("Per show " +orderS); } }
自定义注解:
package com.SpringTestAnnotation.TestValue;import java.lang.annotation.*;@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface OurAnno { }
测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 package com.SpringTestAnnotation;import com.SpringTestAnnotation.TestValue.Per;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class TestAnnotation { public static void main (String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestConfig.class); Per orderS = applicationContext.getBean("per" , Per.class); orderS.show(); } }
输出结果:
可以看见,我们自定义的注解并没有生效。那是因为还差一个自定义实现类。
自定义实现类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 package com.SpringTestAnnotation.TestValue;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.stereotype.Component;import java.lang.reflect.Field;@Component public class OurBeanPostProcessor implements BeanPostProcessor , ApplicationContextAware { private ApplicationContext applicationContext; @Override public Object postProcessBeforeInitialization (Object bean, String beanName) throws BeansException { Class aClass = bean.getClass(); for (Field declaredField : aClass.getDeclaredFields()) { if (declaredField.isAnnotationPresent(OurAnno.class)){ declaredField.setAccessible(true ); Object bean1 = applicationContext.getBean(declaredField.getName()); try { declaredField.set(bean,bean1); } catch (IllegalAccessException e) { e.printStackTrace(); } } } return bean; } @Override public void setApplicationContext (ApplicationContext applicationContext) throws BeansException { this .applicationContext = applicationContext; } }
输出结果:
Per show com.SpringTestAnnotation.TestValue.OrderS@77846d2c