1. SpringBoot自动配置的原理及实现/SpringBoot之@Import注解正确使用方式
https://www.jianshu.com/p/6b2f672e2446 了解SpringBoot之@Import注解正确使用方式 SpringBoot 的核心就是自动配置,自动配置又是基于条件判断来配置 Bean。关于自动配置的源码在 spring-boot -autoconfigure-2.0.3.RELEASE.jar 在通常需要我们在 property 中配置信息时,通常使用 @ConfigurationProperties(pefix=“前缀”) 注解的方式从配置文件中获取配置,如下: application.yml 中配置信息 访问 url 获取配置信息返回的值 http://localhost:8080/msg 如果把 application.yml 中的配置信息注释掉则默认使用 default 值,否则使用配置信息中的值,以上便是普通配置方式 SpringBoot 运行原理 先看 @SpringBootApplication 主要关注的几个注解如下 @SpringBootConfiguration:标记当前类为配置类 @EnableAutoConfiguration:开启自动配置 @ComponentScan:扫描主类所在的同级包以及下级包里的 Bean 关键是 @EnableAutoConfiguration 最关键的要属 @Import(.class),借助** **,@EnableAutoConfiguration 可以帮助 SpringBoot 应用将所有符合条件的 @Configuration 配置都加载到当前 SpringBoot 创建并使用的 IoC 容器: 通过 @Import(.class) 导入的配置功能, 中的方法 getCandidateConfigurations,得到待配置的 class 的类名集合, 这个集合就是所有需要进行自动配置的类,而是是否配置的关键在于 META-INF/spring.factories 文件中是否存在该配置信息 打开,如下图可以看到所有需要配置的类全路径都在文件中,每行一个配置,多个类名逗号分隔, 而 \ 表示忽略换行 整个流程如上图所示 以 类来看其主要构成部分 都能看到各种各样的条件判断注解,满足条件时就加载这个 Bean 并实例化 此类的条件注解是:@ConditionalOnProperty @ConditionalOnBean:当容器里有指定 Bean 的条件下 @ConditionalOnClass:当类路径下有指定的类的条件下 @ConditionalOnExpression:基于 SpEL 表达式为 true 的时候作为判断条件才去实例化 @ConditionalOnjava:基于 JVM 版本作为判断条件 @ConditionalOnJndi:在 JNDI 存在的条件下查找指定的位置 @ConditionalOnMissingBean:当容器里没有指定 Bean 的情况下 @ConditionalOnMissingClass:当容器里没有指定类的情况下 @ConditionalOnWebApplication:当前项目时 Web 项目的条件下 @:当前项目不是 Web 项目的条件下 @ConditionalOnProperty:指定的属性是否有指定的值 @ConditionalOnResource:类路径是否有指定的值 @:当指定 Bean 在容器中只有一个,或者有多个但是指定首选的 Bean 这些注解都组合了 @Conditional 注解,只是使用了不同的条件组合最后为 true 时才会去实例化需要实例化的类,否则忽略 这种 spring4.X 带来的动态组合很容易后期配置,从而避免了硬编码,使配置信息更加灵活多变,同时也避免了不必要的意外异常报错。使用的人只要知道配置的条件即可也不用去阅读源码,方便快捷,这也是 sprignboot 快捷方式带来的好处 参考 HttpEncodingAutoConfiguration 配置信息如下 案例扩展 项目 需要实例化的服务类 配置信息对应的属性映射类, 需要 pom 中加入 spring-boot-starter 依赖 自动配置文件 在创建如下路径文件 src/main/resources/META-INF/spring.factories 必须是自动配置类的全路径 mvn install 该项目 创建一个 springboot-mvc 项目 pom 依赖上面的 jar http://localhost:8080 / 则返回当前服务的默认值 在 applicaton.yml 中加, 重启刷新则会更新为如下信息 SpringBoot 自动化配置关键组件关系图 mybatis-spring-boot-starter、spring-boot-starter-web 等组件的 META-INF 文件下均含有 spring.factories 文件,自动配置模块中,SpringFactoriesLoader 收集到文件中的类全名并返回一个类全名的数组,返回的类全名通过反射被实例化,就形成了具体的工厂实例,工厂实例来生成组件具体需要的 bean。 在 spring boot 中有时候需要控制配置类是否生效, 可以使用 @ConditionalOnProperty 注解来控制 @Configuration 是否生效.
2. SpringBoot自动装配原理
初看@SpringBootApplication有很多的注解组成,其实归纳就是一个”三体”结构,重要的只有三个Annotation:
(1)@Configuration注解
(2)@ComponentScan
(3)@EnableAutoConfiguration
从源码中可以知道,最关键的要属@Import(.class),借助,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。同时借助于Spring框架原有的一个工具类:SpringFactoriesLoader,@EnableAutoConfiguration就可以实现智能的自动配置。
总结 :@EnableAutoConfiguration作用就是从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。这些功能配置类要生效的话,会去classpath中找是否有该类的依赖类(也就是pom.xml必须有对应功能的jar包才行)并且配置类里面注入了默认属性值类,功能类可以引用并赋默认值。生成功能类的原则是自定义优先,没有自定义时才会使用自动装配类。
1、从spring-boot-autoconfigure.jar/META-INF/spring.factories中获取redis的相关配置类全限定名(有120多个的配置类)RedisAutoConfiguration,一般一个功能配置类围绕该功能,负责管理创建多个相关的功能类,比如RedisAutoConfiguration负责:JedisConnectionFactory、RedisTemplate、StringRedisTemplate这3个功能类的创建
2、RedisAutoConfiguration配置类生效的一个条件是在classpath路径下有RedisOperations类存在,因此springboot的自动装配机制会会去classpath下去查找对应的class文件。
3.如果pom.xml有对应的jar包,就能匹配到对应依赖class,
4、匹配成功,这个功能配置类才会生效,同时会注入默认的属性配置类@EnableConfigurationProperties(RedisProperties.class)
5.Redis功能配置里面会根据条件生成最终的JedisConnectionFactory、RedisTemplate,并提供了默认的配置形式@ConditionalOnMissingBean(name = “redisTemplate”)
6.最终创建好的默认装配类,会通过功能配置类里面的 @Bean注解,注入到IOC当中 7.用户使用,当用户在配置文件中自定义时候就会覆盖默认的配置@ConditionalOnMissingBean(name = “redisTemplate”)
1.通过各种注解实现了类与类之间的依赖关系,容器在启动的时候Application.run,会调用.class的selectImports方法(其实是其父类的方法)– 这里需要注意,调用这个方法之前发生了什么和是在哪里调用这个方法需要进一步的探讨
2.selectImports方法最终会调用SpringFactoriesLoader.loadFactoryNames方法来获取一个全面的常用BeanConfiguration列表
3.loadFactoryNames方法会读取FACTORIES_RESOURCE_LOCATION(也就是spring-boot-autoconfigure.jar 下面的spring.factories),获取到所有的Spring相关的Bean的全限定名ClassName,大概120多个
4.selectImports方法继续调用filter(configurations, autoConfigurationMetadata);这个时候会根据这些BeanConfiguration里面的条件,来一一筛选,最关键的是 @ConditionalOnClass,这个条件注解会去classpath下查找,jar包里面是否有这个条件依赖类,所以必须有了相应的jar包,才有这些依赖类,才会生成IOC环境需要的一些默认配置Bean
5.最后把符合条件的BeanConfiguration注入默认的EnableConfigurationPropertie类里面的属性值,并且注入到IOC环境当中
3. 请你谈谈对spring的理解
1.解释spring的ioc? 几种注入依赖的方式?spring的优点? IOC你就认为他是一个生产和管理bean的容器就行了,原来需要在调用类中new的东西,现在都是有这个IOC容器进行产生,同 时,要是产生的是单例的bean,他还可以给管理bean的生命周期! spring的IOC有三种注入方式 : 第一是根据属性注入 也叫set方法注入; 第二种是根据构造方法进行注入; 第三种是根据注解进行注入,这种方式我认为比较好,方便,要是bean多的话,使用前两种方式会使得配置文件过于臃肿。 Spring的优点:主要是根据它的IOC和AOP体现的。我感觉他就是把我们以前用到的工厂模式和代理模式进行了一个封装。 IOC主要是解决了代码的耦合性问题,而AOP是面向切面编程的最好解释!2.解释Spring中IOC, DI, AOP ioc就是控制翻转或是依赖注入。通俗的讲就是如果在什么地方需要一个对象,你自己不用去通过new 生成你需要的对象, 而是通过spring的bean工厂为你长生这样一个对象。 aop就是面向切面的编程。比如说你每做一次对数据库操作,都要生成一句日志。如果,你对数据库的操作有很多类, 那你每一类中都要写关于日志的方法。但是如果你用aop,那么你可以写一个方法,在这个方法中有关于数据库操作的方法, 每一次调用这个方法的时候,就加上生成日志的操作。3.spring的ioc/aop/代理 ioc是控制反转,是spring的核心思想。通过面向接口编程来实现对业务组件的动态依赖。 aop是面向 切面编程,它并不是只在spring或者java中才有的,它和面向对象编程(oop)是相对而言的另一种编程思想。 spring在实现aop编程时利用的是java的代理机制。 个人觉得java代理机制真的是很神奇。核心内容并不多4.spring的ioc是解耦,aop是干什么的 AOP面向切面编程 将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。 比如: 很多方法可能会抛异常,你要记录这个异常到日志中去,可以写个拦截器类,在这个类中记录日志, 在spring.xml中配置一个对这些要记录日志的方法的aop拦截器 在这个方法执行后调用这个拦截器,记录日志。 这样就不用每次抛异常都要手动记录日志。 spring的事务管理用到的就是aop 这样也可以提高程序的内聚性。5.讲解一下Java中Spring中IOC和AOP IoC:说直白点,就是通过配置文件(XML或.properties)指定需要实例化的JAVA类(类名的完整字符串), 包括该JAVA类的一组初始化值,然后我们在代码中加载该配置文件,然后通过 .getBean() 函数就可以得到一个该JAVA类的对象, 并且该对象已经根据配置文件中指定的属性值进行了初始化。 AOP:这个比IoC更简单,直白点说就是实现调用某个方法之前或/和之后,自动执行一系列自定义的语句6.简述Spring框架中IOC和AOP IOC:控制反转,是一种设计模式。一层含义是控制权的转移:由传统的在程序中控制依赖转移到由容器来控制; 第二层是依赖注入:将相互依赖的对象分离,在spring配置文件中描述他们的依赖关系。他们的依赖关系只在使用的时候才建立。 AOP:面向切面,是一种编程思想,OOP的延续。将系统中非核心的业务提取出来,进行单独处理。比如事务、日志和安全等。 Spring 的AOP和IOC都是为了解决系统代码耦合度过高的问题。使代码重用度高、易于维护。 不过AOP和IOC并不是spring中特有的,只是spring把他们应用的更灵活方便 。
4. springboot三大核心注解是什么
springboot三大核心注解是@Configuration,@EnableAutoConfiguration和@ComponentScan。提到@Configuration就要提到他的搭档@Bean,使用这两个注解就可以创建一个简单的spring配置类,可以用来替代相应的xml配置文件。
springboot三大核心注解的特点
这个注解类标识这个类可以使用SpringIoC容器作为bean定义的来源,@Bean注解告诉Spring,一个带有@Bean的注解方法将返回一个对象,该对象应该被注册为在Spring应用程序上下文中的bean。
能够自动配置spring的上下文,试图猜测和配置你想要的bean类,通常会自动根据你的类路径和你的bean定义自动配置,会自动扫描指定包下的全部标有@Component的类,并注册成bean,当然包括@Component下的子注解@Service,@Repository和@Controller。
5. 有哪些比较好的AndroidSQLite开源工具类(android中的sqlite数据库具有哪些特点)
是一个免费的开源的、简易的、遵循Apache2开源协议发布的Android开发框架,其开发宗旨是简单、快速的进行Android应用程序的开发,包含Androidmvc、简易sqliteorm、ioc模块、封装Androidhttpclitent的http模块,具有快速构建文件缓存功能,无需考虑缓存文件的格式,都可以非常轻松的实现缓存,它还基于文件缓存模块实现了图片缓存功能,在android中加载的图片的时候,对oom的问题,和对加载图片错位的问题都轻易解决。他还包括了一个手机开发中经常应用的实用工具类,如日志管理,配置文件管理,android下载器模块,网络切换检测等等工具。
目前主要有以下模块:
MVC模块:实现视图与模型的分离。
ioc模块:android中的ioc模块,完全注解方式就可以进行UI绑定、res中的资源的读取、以及对象的初始化。
数据库模块:android中的orm框架,使用了线程池对sqlite进行操作。
http模块:通过httpclient进行封装http数据请求,支持异步及同步方式加载。
缓存模块:通过简单的配置及设计可以很好的实现缓存,对缓存可以随意的配置
图片缓存模块:imageview加载图片的时候无需考虑图片加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象。
配迅扰颂置器模块:可以对简易的实现配对配置的操作,目前配置文件可以支持Preference、Properties对配置进行存取。
日志打印模块:可以较快的轻易的是实现日志打印,支持日志打印的扩展,目前支持对sdcard写入本地打印、以及控制台打印
下载器模块:可以简单的实现多线程下载、后台下载、断点续传、对下载进李肆行控制、如开始、暂停、删除等亩郑等。
网络状态检测模块:当网络状态改变时,对网络状态进行检测。