spring成神之路-基础(小白也能看懂)

基础

1.什么是IOC

	控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合
度。其中最常见的方式包含:
	 1)依赖注入(Dependency Injection,简称DI)
	 2)依赖查找(Dependency Lookup,简称DL) 
	 3)依赖拖拽(Dependency Pull,简称DP)

	1 什么是依赖注入?
		应用组件不应该负责查找资源或者其他依赖的协作对象。配置对象的工作应该由IoC容器负责,“查找资源”的逻辑应该从
	应用组件的代码中抽取出来,交给IoC容器负责,通俗的说,我们在代码中不需要再自己new一个对象,Sping会根据自
	己的规则将合适的对象动态的分配给我们类中的属性,这样的好处是后期我们可能需要变动此类但不需要修改此处的代
	码,即降低了耦合也易于维护。
	
	2 什么是依赖查找
		DL是IOC的另外一种实现,在需要的时候通过调用框架提供的方法来获取对象,获取时需要提供相关的配置文件路径、
	key等信息;说白了就是根据条件需要自己手动查找获取需要的信息,是需要用户自己去控制的。
	
	3 什么是依赖拖拽
		依赖拖拽与依赖查找使用方式上差不多,区别就是依赖查找是在业务组件代码中进行的,依赖拖拽是从一个集中的注册
	处,在特定的地点执行。

2.为什么要使用Spring IOC?

1.在日常程序开发过程当中,我们推荐面向抽象编程,面向抽象编程会产生类的依赖,当然如果你够强大可以自己写一个管理的
容器也可以不使用,但是既然spring自己实现了而且还很强大,那我们有什么理由不用呢。
2.当我们有了一个管理对象的容器之后,类的产生过程也交给了容器,而我们可以专心的关注自己的业务。

Spring IOC的实现思路和方法
    spring实现IOC的思路是提供一些配置信息用来描述类之间的依赖关系,然后由容器去解析这些配置信息,继而维护好对象之间
的依赖关系,前提是对象之间的依赖关系必须在类中定义好,比如A.class中有一个B.class的属性,那么我们可以理解为A依赖了B;
	
	spring实现IOC的思路大致可以拆分成3点
		1.应用程序中提供类,提供依赖关系(属性或者构造方法)
		2.把需要交给容器管理的对象通过配置信息告诉容器(xml、annotation,javaconfig)
		3.把各个类之间的依赖关系通过配置信息告诉容器
		
		配置这些信息的方法有三种分别是xml,annotation(需要依赖xml或javaconfig)和javaconfig(推荐使用,可以不用配
	置xml文件)
		维护的过程称为自动注入,自动注入的方法包括  '构造方法注入' 和'setter注入'(接口注入在Spring4就被抛弃了)
		自动注入的值可以是对象,数组,map,list和常量等

3.注入的两种实现方式

setter注入
	setter注入需要我们在被注入的类中实现对应属性的set方法,值类型设置非常简单,可以参考其它博客或者该文档:
	https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html
构造器注入
	构造器注入需要我们在自己的类中实现构造方法,按照定义顺序相应赋值,当然也可以通过c:命名空间实现,可以参考文档:
	https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html
属性设置时的另类写法:
	可以通过c:或p:命名空间进行值对象的赋值,但是需要在<beans>标签中添加相应的说明和定义路径,p-namespace不需要
在.xsd中定义,默认已在spring内核中定义,因此不需要再引入.xsd文件。

4.怎么获取对应的对象

	1.基于xml的,ClassPathXmlApplicationContext不会自动开启注解的功能,因此需要自己在配置文件中开启注解:
		ClassPathXmlApplicationContext classContext = new ClassPathXmlApplicationContext("存放xml文件路径"); 
		IndexDaoService indexDaoService = (IndexDaoService)classContext.getBean("配置时的bean名称");
	2.基于javaconfig的,AnnotationConfigApplicationContext已经开启了解析注解的功能,因此只需要配置扫描包路径:
		AnnotationConfigApplicationContext annotationContext = new AnnotationConfigApplicationContext(配置
	的java类.class);
		IndexDaoService indexDaoService = (IndexDaoService)annotationContext .getBean("配置时的bean名称");
	(IndexDaoService是自己定义的类,首行是获取相应的IOC容器方法)

5.spring配置文件

5.1 application.xml

	1.在application.xml中可以开启注解以及扫描,Spring3需要两个设置项,在Spring4以及以后的版本中可以只通过 
<context:component-scan base-package="扫描的包路径"/>设置项开启注解以及配置扫描路径。
	2.在<beans>添加default-autowire="注入类型"可以开启spring的自动装配(全局),注入类型有byName、byType、no等,当开启自动
装配时我们不需要再通过配置文件或者注解来维护类与类之间的依赖关系,spring会自动维护。当我们使用byType时只能有一个
实现类。在使用byName时需要在对应的类中提供setAbCd()方法,Spring会通过set方法的后缀名称abCd来查找对应的bean注入
到相关的bean(@resorce也是通过byName来查找bean,但@resource是通过属性名来查找的,而且不需要提供set方法),no会
关闭自动	装配,当然也可以配置单个bean的装配方式(在bean中添加autowire=“”属性)。

5.2 javaConfig配置文件

	@Configuration //表明这个类是一个Spring配置文件
	@ComponentScan("com.cxj")  //开启注解以及定义要扫描的包路径
	//当使用javaconfig编码风格时,Spring不会再加载xml文件,当我们需要混合使用时,需要添加该注解
	@ImportResource("classpath:spring.xml")
	public class Spring {
	}

5.3 自定义bean名称生成策略

	1.继承BeanNameGenerator,重写方法
	2.在xml中配置<context:component-scan base-package="org.example" name-generator="org.example.MyNameGenerator"
	/>,或在javaconfig中添加@ComponentScan(basePackages = "org.example", nameGenerator = MyNameGenerator.class)

6 BEAN SCOP

	1 singleton :表明此bean在spring整个生命周期只产生一个对象
	2 prototype : 每次获取bean时会新建一个对象
	*3 当在singleton的bean中引入prototype的bean时,会产生一个问题,因为singleton的bean只会产生一次实例化,因此引入的
	prototype的bean也只会初始化一次,导致失去了prototype的意义。
	解决方法:
		1.实现ApplicationContextAware接口,创建ApplicationContext属性,然后通过该上下文getBean;
		2.创建一个抽象方法,返回类型为需要的引入类型,然后在方法上添加注解@Lookup

java继承后或实现后的子类在强转成父类后,实际上只是限制了强转后的实例的访问方法权限,对原类并没有影响(自己的理解)

猜你喜欢

转载自blog.csdn.net/hdjansdasd/article/details/85246373