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

怎么做扒代码网站营销方案格式

怎么做扒代码网站,营销方案格式,seo管理系统培训运营,如何利用网络广告进行推广Spring最重要的功能就是帮助程序员创建对象#xff08;也就是IOC#xff09;#xff0c;而启动Spring就是为创建Bean对象做准备#xff0c;所以我们先明白Spring到底是怎么去创建Bean的#xff0c;也就是先弄明白Bean的生命周期。 Bean的生命周期就是指#xff1a;在Spr…Spring最重要的功能就是帮助程序员创建对象也就是IOC而启动Spring就是为创建Bean对象做准备所以我们先明白Spring到底是怎么去创建Bean的也就是先弄明白Bean的生命周期。 Bean的生命周期就是指在Spring中一个Bean是如何生成的如何销毁的 首先看下 Bean生命周期流程图 我们接着来依次看下bean的生命周期过程 1. 生成BeanDefinition Spring启动的时候会进行扫描会先调用org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#scanCandidateComponents(String basePackage) 扫描某个包路径并得到BeanDefinition的Set集合。 而具体Spring扫描的底层实现包括 1 首先通过ResourcePatternResolver获得指定包路径下的所有.class文件Spring源码中将此文件包装成了Resource对象 2 遍历每个Resource对象 3 利用MetadataReaderFactory解析Resource对象得到MetadataReader在Spring源码中MetadataReaderFactory具体的实现类为CachingMetadataReaderFactoryMetadataReader的具体实现类为SimpleMetadataReader 4 利用MetadataReader进行excludeFilters和includeFilters以及条件注解Conditional的筛选条件注解并不能理解某个类上是否存在Conditional注解如果存在则调用注解中所指定的类的match方法进行匹配匹配成功则通过筛选匹配失败则pass掉。 5 筛选通过后基于metadataReader生成ScannedGenericBeanDefinition 6 再基于metadataReader判断是不是对应的类是不是接口或抽象类 7 如果筛选通过那么就表示扫描到了一个Bean将ScannedGenericBeanDefinition加入结果集 MetadataReader表示类的元数据读取器主要包含了一个AnnotationMetadata功能有获取类的名字、获取父类的名字判断是不是接口等 值得注意的是CachingMetadataReaderFactory解析某个.class文件得到MetadataReader对象是利用的ASM技术并没有加载这个类到JVM。并且最终得到的ScannedGenericBeanDefinition对象beanClass属性存储的是当前类的名字而不是class对象。beanClass属性的类型是Object它即可以存储类的名字也可以存储class对象 最后上面是说的通过扫描得到BeanDefinition对象我们还可以通过直接定义BeanDefinition或解析spring.xml文件的或者Bean注解得到BeanDefinition对象。后续课程会分析Bean注解是怎么生成BeanDefinition的。 2. 合并BeanDefinition 通过扫描得到所有BeanDefinition之后就可以根据BeanDefinition创建Bean对象了但是在Spring中支持父子BeanDefinition和Java父子类类似但是完全不是一回事。 父子BeanDefinition实际用的比较少使用是这样的比如 3. 加载类 BeanDefinition合并之后就可以去创建Bean对象了而创建Bean就必须实例化对象而实例化就必须先加载当前BeanDefinition所对应的class在AbstractAutowireCapableBeanFactory类的createBean()方法中一开始就会调用如下代码 Class? resolvedClass resolveBeanClass(mbd, beanName); 这行代码就是去加载类该方法是这么实现的 if (mbd.hasBeanClass()) {return mbd.getBeanClass(); } if (System.getSecurityManager() ! null) {return AccessController.doPrivileged((PrivilegedExceptionActionClass?) () -doResolveBeanClass(mbd, typesToMatch), getAccessControlContext());} else {return doResolveBeanClass(mbd, typesToMatch); }public boolean hasBeanClass() {return (this.beanClass instanceof Class); }如果beanClass属性的类型是Class那么就直接返回如果不是则会根据类名进行加载doResolveBeanClass方法所做的事情 会利用BeanFactory所设置的类加载器来加载类如果没有设置则默认使用**ClassUtils.getDefaultClassLoader()**所返回的类加载器来加载。 ClassUtils.getDefaultClassLoader()作用解释 1 优先返回当前线程中的ClassLoader 2线程中类加载器为null的情况下返回ClassUtils类的类加载器 3 如果ClassUtils类的类加载器为空那么则表示是Bootstrap类加载器加载的ClassUtils类那么则返回系统类加载器 4. 实例化前 当前BeanDefinition对应的类成功加载后就可以实例化对象了但是… 在Spring中实例化对象之前Spring提供了一个扩展点允许用户来控制是否在某个或某些Bean实例化之前做一些启动动作。这个扩展点叫InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()。比如 Component public class TestBeanPostProcessor implements InstantiationAwareBeanPostProcessor {Overridepublic Object postProcessBeforeInstantiation(Class? beanClass, String beanName) throws BeansException {if (userService.equals(beanName)) {System.out.println(实例化前);}return null;} 如上代码会导致在userService这个Bean实例化前会进行打印。 ​ 值得注意的是postProcessBeforeInstantiation()是有返回值的如果这么实现 Component public class TestBeanPostProcessor implements InstantiationAwareBeanPostProcessor {Overridepublic Object postProcessBeforeInstantiation(Class? beanClass, String beanName) throws BeansException {if (userService.equals(beanName)) {System.out.println(实例化前);return new UserService();}return null;} }userService这个Bean在实例化前会直接返回一个由我们所定义的UserService对象。如果是这样表示不需要Spring来实例化了并且后续的Spring依赖注入也不会进行了会跳过一些步骤直接执行初始化后这一步。 5. 实例化 在这个步骤中就会根据BeanDefinition去创建一个对象了。 5.1 Supplier创建对象 首先判断BeanDefinition中是否设置了Supplier如果设置了则调用Supplier的get()得到对象。 ​ 即直接使用BeanDefinition对象来设置Supplier比如 AbstractBeanDefinition beanDefinition BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition(); beanDefinition.setInstanceSupplier(new SupplierObject() {Overridepublic Object get() {return new UserService();} }); context.registerBeanDefinition(userService, beanDefinition);5.2 工厂方法创建对象 如果没有设置Supplier则检查BeanDefinition中是否设置了factoryMethod也就是工厂方法有两种方式可以设置factoryMethod比如 方式一 bean iduserService classcom.ayu.service.UserService factory-methodcreateUserService / public class UserService {public static UserService createUserService() {System.out.println(执行createUserService());UserService userService new UserService();return userService;}public void test() {System.out.println(test);}}方式二 bean idcommonService classcom.zhouyu.service.CommonService/ bean iduserService1 factory-beancommonService factory-methodcreateUserService /对应的service public class CommonService {public UserService createUserService() {return new UserService();} }Spring发现当前BeanDefinition方法设置了工厂方法后就会区分这两种方式然后调用工厂方法得到对象。 ​ 值得注意的是我们通过Bean所定义的BeanDefinition是存在factoryMethod和factoryBean的也就是和上面的方式二非常类似Bean所注解的方法就是factoryMethodAppConfig对象就是factoryBean。如果Bean所所注解的方法是static的那么对应的就是方式一。 5.3 推断构造方法 在推断构造方法逻辑中除开会去选择构造方法以及查找入参对象意外会还判断是否在对应的类中是否存在使用**Lookup注解**了方法。如果存在则把该方法封装为LookupOverride对象并添加到BeanDefinition中。 推断完构造方法后就会使用构造方法来进行实例化了 在实例化时如果判断出来当前BeanDefinition中没有LookupOverride那就直接用构造方法反射得到一个实例对象。如果存在LookupOverride对象也就是类中存在Lookup注解了的方法那就会生成一个代理对象。 Lookup注解就是方法注入使用demo如下 Component public class UserService {private OrderService orderService;public void test() {OrderService orderService createOrderService();System.out.println(orderService);}Lookup(orderService)public OrderService createOrderService() {return null;}}​6. BeanDefinition的后置处理 Bean对象实例化出来之后接下来就应该给对象的属性赋值了。在真正给属性赋值之前Spring又提供了一个扩展点MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition()可以对此时的BeanDefinition进行加工 具体实例 Component public class TestMergedBeanDefinitionPostProcessor implements MergedBeanDefinitionPostProcessor {Overridepublic void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class? beanType, String beanName) {if (userService.equals(beanName)) {beanDefinition.getPropertyValues().add(orderService, new OrderService());}} }在Spring源码中AutowiredAnnotationBeanPostProcessor就是一个MergedBeanDefinitionPostProcessor它的postProcessMergedBeanDefinition()中会去查找注入点并缓存在AutowiredAnnotationBeanPostProcessor对象的一个Map中injectionMetadataCache。 7. 实例化后 在处理完BeanDefinition后Spring又设计了一个扩展点InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation() 8. 自动注入 这里的自动注入指的是Spring的自动注入 9. 处理属性 这个步骤中就会处理Autowired、Resource、Value等注解也是通过**InstantiationAwareBeanPostProcessor.postProcessProperties()**扩展点来实现的比如我们甚至可以实现一个自己的自动注入功能比如 Component public class TestInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {Overridepublic PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {if (userService.equals(beanName)) {for (Field field : bean.getClass().getFields()) {if (field.isAnnotationPresent(ZhouyuInject.class)) {field.setAccessible(true);try {field.set(bean, 123);} catch (IllegalAccessException e) {e.printStackTrace();}}}}return pvs;} }10. 执行Aware 完成了属性赋值之后Spring会执行一些回调包括 BeanNameAware回传beanName给bean对象。 BeanClassLoaderAware回传classLoader给bean对象。 BeanFactoryAware回传beanFactory给对象。 11. 初始化前 初始化前也是Spring提供的一个扩展点BeanPostProcessor.postProcessBeforeInitialization() 利用初始化前可以对进行了依赖注入的Bean进行处理。 示例 Component public class TestBeanPostProcessor implements BeanPostProcessor {Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (userService.equals(beanName)) {System.out.println(初始化前);}return bean;} }12. 初始化 查看当前Bean对象是否实现了InitializingBean接口如果实现了就调用其afterPropertiesSet()方法执行BeanDefinition中指定的初始化方法 13. 初始化后 这是Bean创建生命周期中的最后一个步骤也是Spring提供的一个扩展点BeanPostProcessor.postProcessAfterInitialization() 可以在这个步骤中对Bean最终进行处理Spring中的AOP就是基于初始化后实现的初始化后返回的对象才是最终的Bean对象。 Component public class ZhouyuBeanPostProcessor implements BeanPostProcessor {Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (userService.equals(beanName)) {System.out.println(初始化后);}return bean;} } 总结BeanPostProcessor 1 InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation() 2 实例化 3 MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition() 4 InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation() 5 自动注入 6 InstantiationAwareBeanPostProcessor.postProcessProperties() 7 Aware对象 8 BeanPostProcessor.postProcessBeforeInitialization() 9 初始化 10 BeanPostProcessor.postProcessAfterInitialization()
http://www.pierceye.com/news/298644/

相关文章:

  • 济宁网站建设方面舟山网站设计公司
  • 局域网网站建设多少钱wordpress企业站主题
  • asp做网站用什么写脚本营销网站开发系统
  • 企业网站建设心得中国八大设计院排名
  • 网站建设与管理总结心得找工作在什么网站找比较好
  • wordpress 赢利模式佛山百度seo排名
  • 关停网站的申请营销型网站建设目的和意义
  • 网站是做推广好还是优化好广西大兴建设有限公司网站
  • 书籍教你如何做网站南阳定制网站制作价格低
  • 联合实验室 网站建设方案网站 手机兼容
  • 保定网站建设培训班团员团干部如何登录到系统
  • 做网站的旅行社手机页面网站模板怎么卖
  • 潮州南桥市场中国建设银行网站企业为什么要建设网站
  • 东营seo整站优化禁止wordpress历史版本
  • 太原网站建设与维护秦皇岛建设局
  • 我的世界做壁纸的网站学生班级优化大师
  • 高端大气上档次网站网站建立基本流程
  • 找人做网站如何担保江门网站建设
  • 张家界住房和城乡建设局网站各大网站提交入口网址
  • 张家港建网站Wordpress主页不要全部显示
  • 竞猜网站模板经典创意营销案例
  • 网站如何盈利流量费wordpress主题转html
  • html5做视频网站电脑制作h5最常用软件
  • 做印刷的网站有哪些百度网盟推广价格
  • 杭州网站seo优化国企央企都玩劳务外包
  • 杭州seo网站推广排名上市公司的信息网站
  • 做互联网网站的会抓西安小程序专业开发公司
  • 安徽省建设厅八大员报名网站网页设计兼职平台
  • 网站建设专利个人备案网站可以做商城展示
  • 北京做网站好的公司南充建设企业网站