桂林哪里做网站,北京昌平网站设计,电商个人网站建设,软件定制开发公司地址为了感谢罕哥对我工作的帮助#xff0c;特此记录下学习过程#xff0c;期待成为和罕哥一样优秀的人
时间#xff1a;2024.7.13
内容#xff1a;spring源码课程3学习记录
一、BeanDefinition
BeanDefinition表示Bean的定义#xff0c;BeanDefinition中存在很多属性用来…为了感谢罕哥对我工作的帮助特此记录下学习过程期待成为和罕哥一样优秀的人
时间2024.7.13
内容spring源码课程3学习记录
一、BeanDefinition
BeanDefinition表示Bean的定义BeanDefinition中存在很多属性用来描述一个Bean的特点 class表示Bean类型 scope表示Bean的作用域单例/原型 lazyInit表示Bean是否是懒加载 initMethodName表示Bean初始化时要执行的方法 destroyMethodName表示Bean销毁时要执行的方法 ........ 二、在Spring中定义Bean的方式
声明式定义
1、bean/
2、Bean
3、Component(Service,Controller)
编程式定义
直接通过BeanDefinition此处就是Spring源码定义一个Bean的实现过程 AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class);AbstractBeanDefinition beanDefinition BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();beanDefinition.setBeanClass(UserService.class);beanDefinition.setScope(prototype);//把beanDefinition注册到容器中context.registerBeanDefinition(userService,beanDefinition);UserService userService (UserService)context.getBean(userService);userService.test(); 三、Spring内部的组件
下面的组件在Spring中使用的很少但是在源码中使用的很多学习有利于理解源码
1、AnnotatedBeanDefinitionReader
可以直接把某个类转换为BeanDefinition并读取解析类的注解。就是BeanDefiniton读取器。把读到的BeanDefinition存到容器中 AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class);AnnotatedBeanDefinitionReader annotatedBeanDefinitionReader new AnnotatedBeanDefinitionReader(context);//将UserService.class解析为BeanDefinitionannotatedBeanDefinitionReader.register(UserService.class);System.out.println(context.getBean(userService));
2、XmlBeanDefinitionReader
可以解析bean/标签 AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class);XmlBeanDefinitionReader xmlBeanDefinitionReader new XmlBeanDefinitionReader(context);xmlBeanDefinitionReader.loadBeanDefinitions(spring.xml);
3、ClassPathBeanDefinitionScanner
扫描器和BeanDefinitionReader类似对某个包路径就行扫描对扫描的类进行解析如果存在Component注解就会把这个类解析为一个BeanDefinition AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext();context.refresh();ClassPathBeanDefinitionScanner scanner new ClassPathBeanDefinitionScanner(context);int i scanner.scan(org.com.zhuyn);System.out.println(context.getBean(userService));
四、ApplicationContext与BeanFactory
ApplicationContext继承了BeanFactory除此之外还继承了别的 ApplicationEnventPublisher事件发布器 EnvironmentCapable获取环境变量的功能 MessageSource进行国际化的功能 ResourcepatternResolver解析某些资源的功能 因此当我们使用applicationContext.getBean(xxx)的时候本质上是使用的DefaultListableBeanFactory来获取的。
1、ResourcepatternResolver
1拿文件资源 ApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class);Resource resource context.getResource(file://C:\\Usersxxxxxxxxx);System.out.println(resource.contentLength());2拿url ApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class);Resource resource context.getResource(https://www.baidu.com);System.out.println(resource.contentLength());System.out.println(resource.getURL());
这里的Resource可以拿很多种资源。
2、ApplicationEnventPublisher
在工作当中可以直接定义一个事件发布器、
Component
public class UserService {private ApplicationEventPublisher applicationEventPublisher;}
也可以使用applicationContext自带的事件发布器
Component
public class UserService {Autowiredprivate ApplicationContext context;public void test(){context.publishEvent(hello);System.out.println(test);}}
事件监听器
ComponentScan(org.com.zhuyn)
public class AppConfig {Beanpublic ApplicationListener applicationListener(){return new ApplicationListener() {Overridepublic void onApplicationEvent(ApplicationEvent applicationEvent) {System.out.println(发布了一个事件applicationEvent);}};}
}
五、类型转化
1、PropertyEditor
把字符串转换成user对象。
类型转换器
public class StringToUserPropertyEditor extends PropertyEditorSupport implements PropertyEditor {Overridepublic void setAsText(String text) throws IllegalArgumentException {User user new User();user.setName(text);this.setValue(user);}
}类型转换器的使用 ApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class);StringToUserPropertyEditor propertyEditor new StringToUserPropertyEditor();propertyEditor.setAsText(xiaoming);User user (User) propertyEditor.getValue();System.out.println(user.getName()); 在spring内部也使用到了类型转换例如当我们使用这个
UserService userservice context.getBean(userServiceUserService.class)
我们传一个string类型得到一个UserService类型的对象。
2、ConversionService
3、TypeConverter
六、比较器
可以根据Order注解或实现Ordered接口来执行值进行比较从而可以进行排序。
Ordered接口实现方法
1、在类上实现Ordered接口
2、使用OrderComparator构建比较器
类A
public class A implements Ordered {Overridepublic int getOrder() {return 1;}
}
类B
public class B implements Ordered {Overridepublic int getOrder() {return 10;}
}应用 A a new A();B b new B();OrderComparator comparator new OrderComparator();System.out.println(comparator.compare(a, b));//-1 a大为1b大为-1List list new ArrayList();list.add(a);list.add(b);//按order值升序排序list.sort(comparator);System.out.println(list);//[org.com.zhuyn.Service.A2f2c9b19, org.com.zhuyn.Service.B31befd9f]
Order注解实现方法
Spring提供了OrderComparator的子类AnnotationAwareOrderComparator它支持使用Order来指定order值
类C
Order(1)
public class C {
}
类D
Order(10)
public class D {}
应用 C c new C();D d new D();AnnotationAwareOrderComparator comparator new AnnotationAwareOrderComparator();System.out.println(comparator.compare(c,d));//-1
七、类的元数据
在Spring中需要去解析类的信息比如类名类中的方法类上的注解这些都可以称为类的元数据。所以Spring中对类的元数据做了抽象并提供了一些工具类。
1、MetaDataReader类的元数据读取器
解析一个类得到类的所有信息。AnnotatedBeanDefinitionReader 只读取了类的注解而MetaDataReader读取了一个类的所有信息包括类的注解类继承了什么类实现了哪些方法.....等等。
MetaDataReader是一个接口默认实现类为SimpleMetadataReader。 SimpleMetadataReaderFactory simpleMetadataReaderFactory new SimpleMetadataReaderFactory();//构造一个MetaDataReaderMetadataReader metadataReader simpleMetadataReaderFactory.getMetadataReader(org.com.zhuyn.Service.UserService);//得到一个ClassMetaData并获取类名ClassMetadata classMetadata metadataReader.getClassMetadata();System.out.println(classMetadata.getClassName());//获取接口名字结果为一个数组System.out.println(classMetadata.getInterfaceNames()[0]);//类上注解的信息AnnotationMetadata annotationMetadata metadataReader.getAnnotationMetadata();for(String annotionMetadata:annotationMetadata.getAnnotationTypes()){System.out.println(annotionMetadata);}
八、过滤器
1、excludeFilters
排除类名为UserService的类,就算她上面有component注解也不会成为Bean
ComponentScan(value org.com.zhuyn,
excludeFilters {ComponentScan.Filter(type FilterType.ASSIGNABLE_TYPE,classes UserService.class
)
})
public class AppConfig {}
2、includeFilters
就算UserService类上没有Component注解它也会被扫描成为一个Bean。
ComponentScan(value org.com.zhuyn,
includeFilters {ComponentScan.Filter(type FilterType.ASSIGNABLE_TYPE,classes UserService.class
)})
public class AppConfig{
}
九、FactoryBean
可以通过这个来自己创建一个Bean