Autowire

Java 必看的 Spring 知识汇总!

瘦欲@ 提交于 2020-08-15 07:13:48
Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性的角度而言,绝大部分Java应用都可以从Spring中受益。 Spring优点: 低侵入式设计,代码的污染极低; 独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺; Spring的IoC容器降低了业务对象替换的复杂性,提高了组件之间的解耦 Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用; Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问; pring的高度开放性,并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部。 Spring框架的组成结构图: Spring的核心机制 管理 Bean 程序主要是通过Spring容器来访问容器中的Bean,ApplicationContext是Spring容器最常用的接口,该接口有如下两个实现类: ClassPathXmlApplicationContext: 从类加载路径下搜索配置文件,并根据配置文件来创建Spring容器;

spring源码解析---spring-core(三)

旧巷老猫 提交于 2020-08-15 02:52:24
getBean 这里便是bean初始化的核心逻辑。源码比较复杂,分开说。以getBean(String name)为例。AbstractBeanFactory.getBean: @Overridepublic Object getBean(String name) throws BeansException { return doGetBean(name, null, null, false); } 第二个参数表示bean的Class类型,第三个表示创建bean需要的参数,最后一个表示不需要进行类型检查。 beanName转化 final String beanName = transformedBeanName(name); 这里是将FactoryBean的前缀去掉以及将别名转为真实的名字。 手动注册bean检测 前面注册环境一节说过,Spring其实手动注册了一些单例bean。这一步就是检测是不是这些bean。如果是,那么再检测是不是工厂bean,如果是返回其工厂方法返回的实例,如果不是返回bean本身。 Object sharedInstance = getSingleton(beanName); if (sharedInstance != null && args == null) { bean = getObjectForBeanInstance

Spring系列.依赖注入配置

醉酒当歌 提交于 2020-08-14 08:50:32
依赖注入的配置 Spring的依赖注入分为 基于构造函数的依赖注入 和 基于setter方法的依赖注入 。 基于构造函数的依赖注入 <!-- 通过构造器参数索引方式依赖注入 --> <bean id="byIndex" class="cn.javass.spring.chapter3.HelloImpl3"> <constructor-arg index="0" value="Hello World!"/> <constructor-arg index="1" value="1"/> </bean> <!-- 通过构造器参数类型方式依赖注入 --> <bean id="byType" class="cn.javass.spring.chapter3.HelloImpl3"> <constructor-arg type="java.lang.String" value="Hello World!"/> <constructor-arg type="int" value="2"/> </bean> <!-- 通过构造器参数名称方式依赖注入 --> <bean id="byName" class="cn.javass.spring.chapter3.HelloImpl3"> <constructor-arg name="message" value="Hello World!"/>

ARouter路由简单使用以及源码解析

跟風遠走 提交于 2020-08-14 08:32:42
ARouter相关文章虽然对,作为学习笔记使用,有问题希望能够尽情提出,共同交流 蒋八九 基本使用: Application中的注册: @Override public void onCreate ( ) { super . onCreate ( ) ; //官方建议推荐在Application中初始化 ARouter . init ( this ) ; } @Override public void onTerminate ( ) { super . onTerminate ( ) ; ARouter . getInstance ( ) . destroy ( ) ; } Activity中: 类必须注册路由地址 @Route ( path = Constance . PATH_MAINACTIVITY ) public class MainActivity extends AppCompatActivity { @Override protected void onCreate ( Bundle savedInstanceState ) { super . onCreate ( savedInstanceState ) ; setContentView ( R . layout . activity_main ) ; 注册路由 ARouter . getInstance ( )

自定义注解扫描BEAN

纵然是瞬间 提交于 2020-08-12 19:16:56
自定义注解扫描BEAN 为什么要自定义注解扫描生成bean呢? 这个需求类似Mybatis的Mapper扫描,在项目中有一些代码逻辑是固定的,仅仅是些运行时需要的值不一样,这时候如果将这些逻辑通过一点点的代码就生成多好呀 我在项目中的需求:一些接口需要对接其他系统的接口或者直接访问数据 ,但是这些系统的接口可能会随时更改或者同时可用,或者一会用新版本的一会用旧版本的,我们想在尽量不更改我方代码的情况下对接这些系统,并且可以通过更新数据的方式控制调用的接口版本 思路:核心代码中不直接对接第三方系统,对应他们每一个版本的接口增加一个中间层服务,核心代码中调用这些中间层,每个中间层接口有自己的接口ID更新ID对应的使用地址来达到上面的要求 名词 BeanDefinition BeanDefinition 是对一个类的描述,spring 会根据这些描述来生成一个具体的对象, 他会描述哪些内容呢?类的基本属性,比如Class,spring字义的一些属性,比较scope,lazy,initMethod,destoryMethod等等,这些大都有相对应的定义Bean方法时会用到的注解(@IsLazy, @Scope ,@DepenseOn等等) FactoryBean FactoryBean是一个比较特殊的Bean,当spring发现你要生成的Bean是一个FactoryBean 时

Spring的奇幻操作

安稳与你 提交于 2020-08-12 09:03:35
看效果 StudentService 一个很普通的方法打印出一句话 UserService 里面包含一个StudentService,并在testStudent方法里调用StudentService里的方法 配置类 测试类及效果 现象说明 我们的UserService里并没有用常见的方法在StudentService上加@Autowired注解,但经测试发现StudentService还是顺利的被注入进去了,这是如何操作的呢? 解释 首先,SpringConfig中可见我们用了一个@Import注解并设置了ImportRegister类 UserService的注册 我们实例化出一个GenericBeanDefinition,设置了beanClass,并用registry注册进Spring容器(有关GenericBeanDefinition的请移步 https://my.oschina.net/u/4523612/blog/4264082 import不了解的请先查一下资料学习一下) 这一步解释了为什么我们能从容器中取出UserService对象来。下面我们解释UserService里为什么能注入StudentService 关键代码 其实关键代码就这一句,就是把BeanDefinition的AutowireMode设置为了AUTOWIRE_BY_TYPE

Spring系列.依赖注入配置

百般思念 提交于 2020-08-11 16:33:21
依赖注入的配置 Spring的依赖注入分为 基于构造函数的依赖注入 和 基于setter方法的依赖注入 。 基于构造函数的依赖注入 <!-- 通过构造器参数索引方式依赖注入 --> <bean id="byIndex" class="cn.javass.spring.chapter3.HelloImpl3"> <constructor-arg index="0" value="Hello World!"/> <constructor-arg index="1" value="1"/> </bean> <!-- 通过构造器参数类型方式依赖注入 --> <bean id="byType" class="cn.javass.spring.chapter3.HelloImpl3"> <constructor-arg type="java.lang.String" value="Hello World!"/> <constructor-arg type="int" value="2"/> </bean> <!-- 通过构造器参数名称方式依赖注入 --> <bean id="byName" class="cn.javass.spring.chapter3.HelloImpl3"> <constructor-arg name="message" value="Hello World!"/>

Spring基础知识

◇◆丶佛笑我妖孽 提交于 2020-08-11 01:47:28
Q:Spring依赖注入方式都有哪几种? A:Spring依赖注入方式有3种,分别是属性注入(set注入)、构造方法注入。工厂方法注入。可以通过注解或者XML配置文件的形式进行注入。 1、属性注入 属性注入即通过 setXxx() 方法注入 Bean 的属性值或者依赖对象,由于属性注入方式具有可选择性和灵活性高的优点,因此属性注入是实际项目中最常采用的注入方式 。 属性注入要求 Bean 提供一个默认的构造函数,并为需要注入的属性提供对应的 Setter 方法 。Spring 先调用 Bean 的默认构造函数实例化 Bean 对象,然后通过反射来调用 Setter 方法注入属性值。 2、构造方法注入 构造函数注入保证一些必要的属性在 Bean 实例化时就得到设置,这样 Bean 在实例化后就可以使用 。 使用构造函数注入的前提是 Bean 必须提供带参的构造函数。 如果构造函数进行了重载,则需要通过指定索引、参数类型等方式,定位唯一的构造函数。 否则Spring将 随机采用一个匹配的构造函数来实例化 Bean ,而被选择的构造函数可能并不是我们所希望的,导致出现不可预期的结果。 3、工厂方法注入 为需要注入的Bean指定它的Factory Bean,并指定Factory Method,然后通过Factory Method提供的方法获取要注入的对象实例。

Bean后置处理器

江枫思渺然 提交于 2020-08-06 15:34:40
spring在创建对象( org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance )的时候, 使用了这个 构造函数后置处理器, 用来选择使用哪个构造函数的. 所以这个后置处理器的执行时机是: 对象 实例化之前执行 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#determineConstructorsFromBeanPostProcessors @Nullable protected Constructor<?>[] determineConstructorsFromBeanPostProcessors(@Nullable Class<?> beanClass, String beanName) throws BeansException { if (beanClass != null && hasInstantiationAwareBeanPostProcessors()) { for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof

doCreateBean

可紊 提交于 2020-08-05 04:53:32
属性扫描完成之后, 就可以开始属性注入了. 代码块: org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean boolean earlySingletonExposure = (mbd.isSingleton() && this .allowCircularReferences && isSingletonCurrentlyInCreation(beanName)); if (earlySingletonExposure) { if (logger.isTraceEnabled()) { logger.trace( "Eagerly caching bean '" + beanName + "' to allow for resolving potential circular references" ); } // 这里创建了一个匿名的 ObjectFactory 实现类, 他是一个工厂, 可以用来获取对象 // addSingletonFactory中, 将这个工厂放到 singletonFactories 中去了. singletonFactories 是spring的三级缓存 addSingletonFactory(beanName, () ->