南宁制作网站多少钱邢台做网站地方

当前位置: 首页 > news >正文

南宁制作网站多少钱,邢台做网站地方,百度投稿平台,广告设计学校Autowired注解依赖注入过程 一、findAutowireCandidates()实现 找出BeanFactory中类型为type的所有的Bean的名字#xff0c;注意是名字#xff0c;而不是Bean对象#xff0c;因为我们可以根据BeanDefinition就能判断和当前type是不是匹配#xff0c;不用生成Bean对象把re…Autowired注解依赖注入过程 一、findAutowireCandidates()实现 找出BeanFactory中类型为type的所有的Bean的名字注意是名字而不是Bean对象因为我们可以根据BeanDefinition就能判断和当前type是不是匹配不用生成Bean对象把resolvableDependencies中key为type的对象找出来并添加到result中遍历根据type找出的beanName判断当前beanName对应的Bean是不是能够被自动注入先判断beanName对应的BeanDefinition中的autowireCandidate属性如果为false表示不能用来进行自动注入如果为true则继续进行判断判断当前type是不是泛型如果是泛型是会把容器中所有的beanName找出来的如果是这种情况那么在这一步中就要获取到泛型的真正类型然后进行匹配如果当前beanName和当前泛型对应的真实类型匹配那么则继续判断如果当前DependencyDescriptor上存在Qualifier注解那么则要判断当前beanName上是否定义了Qualifier并且是否和当前DependencyDescriptor上的Qualifier相等相等则匹配经过上述验证之后当前beanName才能成为一个可注入的添加到result中 二、关于依赖注入中泛型注入的实现 首先在Java反射中有一个Type接口表示类型具体分类为 raw types也就是普通Classparameterized types对应ParameterizedType接口泛型类型array types对应GenericArrayType泛型数组type variables对应TypeVariable接口表示类型变量也就是所定义的泛型比如T、Kprimitive types基本类型int、boolean public class TypeTestT {private int i;private Integer it;private int[] iarray;private List list;private ListString slist;private ListT tlist;private T t;private T[] tarray;public static void main(String[] args) throws NoSuchFieldException {test(TypeTest.class.getDeclaredField(i));System.out.println();test(TypeTest.class.getDeclaredField(it));System.out.println();test(TypeTest.class.getDeclaredField(iarray));System.out.println();test(TypeTest.class.getDeclaredField(list));System.out.println();test(TypeTest.class.getDeclaredField(slist));System.out.println();test(TypeTest.class.getDeclaredField(tlist));System.out.println();test(TypeTest.class.getDeclaredField(t));System.out.println();test(TypeTest.class.getDeclaredField(tarray));}public static void test(Field field) {if (field.getType().isPrimitive()) {System.out.println(field.getName() 是基本数据类型);} else {System.out.println(field.getName() 不是基本数据类型);}if (field.getGenericType() instanceof ParameterizedType) {System.out.println(field.getName() 是泛型类型);} else {System.out.println(field.getName() 不是泛型类型);}if (field.getType().isArray()) {System.out.println(field.getName() 是普通数组);} else {System.out.println(field.getName() 不是普通数组);}if (field.getGenericType() instanceof GenericArrayType) {System.out.println(field.getName() 是泛型数组);} else {System.out.println(field.getName() 不是泛型数组);}if (field.getGenericType() instanceof TypeVariable) {System.out.println(field.getName() 是泛型变量);} else {System.out.println(field.getName() 不是泛型变量);}}} Spring中但注入点是一个泛型时也是会进行处理的比如 Component public class UserService extends BaseServiceOrderService, StockService {public void test() {System.out.println(o);}}public class BaseServiceO, S {Autowiredprotected O o;Autowiredprotected S s; } Spring扫描时发现UserService是一个Bean那就取出注入点也就是BaseService中的两个属性o、s接下来需要按注入点类型进行注入但是o和s都是泛型所以Spring需要确定o和s的具体类型。因为当前正在创建的是UserService的Bean所以可以通过userService.getClass().getGenericSuperclass().getTypeName()获取到具体的泛型信息比如com.zhouyu.service.BaseServicecom.zhouyu.service.OrderService, com.zhouyu.service.StockService然后再拿到UserService的父类BaseService的泛型变量 for (TypeVariable? extends Class? typeParameter : userService.getClass().getSuperclass().getTypeParameters()) { System.out.println(typeParameter.getName()); }通过上面两段代码就能知道o对应的具体就是OrderServices对应的具体类型就是StockService然后再调用oField.getGenericType()就知道当前field使用的是哪个泛型就能知道具体类型了 三、Primary、Priority 1、Primary示例 定义一个主类依赖三个bean Component public class UserService {Autowiredprivate OrderInterface orderInterface;public void test() {System.out.println(orderInterface.getClass().getSimpleName());}}public interface OrderInterface { }Component public class OrderService implements OrderInterface {BeanPrimarypublic OrderInterface order() {return new OrderService2();} }Component public class OrderService1 implements OrderInterface {}public class OrderService2 implements OrderInterface {} 打印最后注入到属性的值 AnnotationConfigApplicationContext applicationContext new AnnotationConfigApplicationContext(AppConfig.class);UserService userService (UserService) applicationContext.getBean(userService);userService.test(); 打印结果OrderService2 会对使用Primary注解的bean注入依赖的属性或对应方法中 2、Priority示例 Component public class UserService {Autowiredprivate OrderInterface orderInterface;public void test() {System.out.println(orderInterface.getClass().getSimpleName());}}public interface OrderInterface { }Component Priority(3) public class OrderService implements OrderInterface {}Component Priority(1) public class OrderService1 implements OrderInterface {}Component Priority(4) public class OrderService2 implements OrderInterface {} 打印最后注入到属性的值 AnnotationConfigApplicationContext applicationContext new AnnotationConfigApplicationContext(AppConfig.class);UserService userService (UserService) applicationContext.getBean(userService);userService.test(); 打印结果OrderService1 会对使用Priority注解的类设置的值最小注入到对应属性或方法参数中 四、Qualifier的使用 定义两个注解Target({ElementType.TYPE, ElementType.FIELD}) Retention(RetentionPolicy.RUNTIME) Qualifier(random) public interface Random { } Target({ElementType.TYPE, ElementType.FIELD}) Retention(RetentionPolicy.RUNTIME) Qualifier(roundRobin) public interface RoundRobin { } 定义一个接口和两个实现类表示负载均衡 public interface LoadBalance {String select(); } ​Component Random public class RandomStrategy implements LoadBalance {Overridepublic String select() {return null;} }Component RoundRobin public class RoundRobinStrategy implements LoadBalance {Overridepublic String select() {return null;} } 使用 Component public class UserService {AutowiredRoundRobinprivate LoadBalance loadBalance;public void test() {System.out.println(loadBalance);}}