ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SpringIOC整理笔记,让你学会IOC

2021-10-26 17:01:59  阅读:179  来源: 互联网

标签:SpringIOC 配置文件 对象 spring 笔记 注解 属性 IOC 赋值


一.Spring IOC:

spring是一个容器,把项目中用的对象放入到容器中,让容器完成对象的创建和对象之间关系的管理(属性赋值),我们在程序中从容器中获取要使用的对象
1.spring的优点:

  • 轻量
  • 针对接口编程,解耦合(ioc能够实现业务对象之间的解耦合,例如service和dao对象之间的解耦合)
  • AOP编程的支持
  • 方便集成各种优秀框架

2.Spring容器将什么样的对象放入进去了:

  • dao类,service类,controller类,工具类

3.不放进容器的:

  1. 实体类对象,实体类数据来自数据库的
  2. servlet,listener,filter等

二.框架怎么学:

  1. 框架是一个软件,其他人写好的软件
  2. 知道框架能做什么,mybatis–访问数据库,对表中的数据执行CRUD
  3. 框架的语法,框架要完成一个功能,需要一定的步骤支持的
  4. 框架的内部实现,框架内部怎么做,原理是什么
  5. 通过学习,可以实现一个框架
  6. spring的核心功能: ioc

三.IoC控制反转:

  1. 控制反转,是一个概念,是一种思想,指导开发人员在容器中,管理对象,给对象赋值,管理依赖
  2. 控制:创建对象,对象的属性赋值,对象之间的关系管理
  3. 反转:由容器代替开发人员管理对象,创建对象,给属性赋值
  4. 正转:使用new构造方法创建对象,开发人员主动管理对象
  public static void main(String[] args){
		Student student = new Student();//在代码中,创建对象----正转
  }
  1. 容器:是一个服务器软件,一个框架(Spring)
  2. Ioc目的就是减少对代码的改动,能实现不同的功能,实现解耦合
  3. java中创建对象有哪些方式:
    1.构造方法,new Student(); 2.反射
    3.序列化                             3.克隆
    5.ioc:容器创建对象             6.动态代理

四.IoC的技术实现:

  1. DI是ioc的技术实现
  2. DI(Dependency Injection):依赖注入,只需要在程序中提供要使用的对象名称就可以,至于对象如何在容器中创建,赋值,查找都由容器内部实现,创建对象使用的是反射机制
  3. spring是使用的DI实现了ioc的功能,spring底层创建对象,使用的是反射机制
  4. spring是一个容器,管理对象,给属性赋值,底层是反射创建对象

五.spring的配置文件(在resources类目录下):

  1. beans:是根标签,spring把java对象称为bean配置文件:(配置文件一般的文件名叫applicationContext.xml)
  2. bean:
    1. 声明bean,就是创建类的对象
    2. 属性:
      1. id:对象的自定义名称,唯一值,spring通过这个名称找到对象
      2. class:类的全限定名称(不能是接口,因为spring是反射机制创建对象,必须使用类)
      3. spring框架有一个map存放对象的,spring把创建好的"对象"放入到map中:
        1. springMap.put(id,对象);
          例如:
          springMap.put(“someService”,new SomeServiceImpl());
      4. 声明bean,使用bean中对象用接口ApplicationContext的子类ClassPathXmlApplicationContext(String config);
        1. ClassPathXmlApplicationContext(Stringconfig):表示从类路径(target/classes)中加载spring的配置文件
      5. ApplicationContext的方法:
        1. Object getBean(String object):返回一个bean对象
        2. int getBeanDefinitionCount():获取容器中定义的对象的数量
        3. String[ ] getBeanDefinitionNames():以数组方式获取容器中每对象的名称(id)
      6. ClassPathXmlApplicationContext:是spring默认创建对象的时机,会创建容器中
        所有的对象无参数构造方法,如果在使用对象时,未找到对象,会在一次进行扫描

六.给属性赋值:

  1. di的实现有两种:
    1. 在spring的配置文件中,使用标签和属性完成,叫做基于XML的di实现
    2. 使用spring中的注解,完成属性赋值,叫做基于注解的di实现
  2. di的语法分类:
    1. set注入(设置注入):spring调用类的set方法,在set方法可以实现属性的赋值
    2. 构造注入,spring调用类的有参数构造方法,创建对象,在构造方法中完成赋值
    3. 注入:就是赋值的意思
    4. 简单类型:spring中规定java的基本数据类型和String,Integer等都是简单类型
    5. 所有值必须放入到" "中,这是xml的规则
  3. 第一种方式set注入(设置注入):
    1. spring调用类的set方法
    2. 简单类型的set注入:
      1. property属性标签:
        1. name:属性名字(去除set的名字)
        2. value:字面值
        3. ref:Bean的id
          < bean id=“xx” class=“xx” >
          < property name=“属性名字” value=“此属性的值”/ >
          一个property只能给一个属性赋值
          < property… >
          < /bean >
    3. 引用类型的set注 :
   <bean id="xx" class="xx">
   	<property name="属性名字" ref="Bean的id"/>
   </bean>
  1. 第二种方式构造注入:
    1. spring调用类有参数构造方法,在创建对象的同时,在构造方法中给属性赋值
    2. 构造注入使用标签:
      1. 标签:一个表示构造方法一个参数
      2. 标签属性:
        • name:表示构造方法的形参名
        • index:表示构造方法的参数的位置,参数从左往右位置是0,1,2的顺序
        • value:构造方法的形参类型是简单类型,使用value
        • ref:构造方法的形参类型是引用类型的,使用ref
	<bean id="myStudent_One" class="com.hj.ba01.Student">
		<constructor-arg name="name" value="ww"/>
		<constructor-arg name="age" value="23"/>
		<constructor-arg name="school" ref="mySchool"/>
	</bean>
  1. index属性:表示构造方法形参的位置,从0开始:
	<bean id="myStudent_Two" class="com.hj.ba01.Student">
		<constructor-arg index="0" value="qq"/>
		<constructor-arg index="1" value="23"/>
		<constructor-arg index="2" ref="mySchool"/>
	</bean>
  1. 省略index,按照参数顺序传递:
	<bean id="myStudent_Three" class="com.hj.ba01.Student">
		<constructor-arg value="qq"/>
		<constructor-arg value="23"/>
		<constructor-arg ref="mySchool"/>
	</bean>

七.引用类型的自动注入:

  1. spring框架根据某些规则可以给"引用类型"赋值,使用规则常用的的是byName,byType
  2. byName(按名称注入):
    1. java类中引用类型的"属性名"和bean的id名称一样且数据类型一致的,这样bean的id就自动赋值给类的"引用类型"
      语法:
	<bean id="xx" class="yy" autowire="byName">
		简单类型属性赋值		       					
	</bean>
  1. byType(按类型注入):
    1. java类中引用类型的"数据类型"和bean的class属性是同源关系的,
      这样的bean能够赋值给引用类型
    2. 同源就是一类的意思:
      1. java类中引用类型的数据类型与bean的class的数据类型一致,是父子类关系,或是接口和实现类关系的
    3. 语法:
	<bean id="xx" class="yy" autowire="byType">
		简单类型属性赋值
	</bean>

                4. 在byType中,在xml配置文件中声明bean只能有一个符合条件的,多余一个事错误的

八.多个配置优势:

  • 每个文件的大小比一个文件要小很多,效率高
  • 避免多人竞争带来的冲突
  • 多文件的分配方式:
    1. 按功能模块,一个模块一个配置文件
    2. 按类的功能,数据库相关的配置一个配置文件,做事务的功能一个配置文件,做service功能的一个配置文件等
  • 包含关系配置文件:
    1. 整合表示主配置文件:包含其他的配置文件的,主配置文件一般不是定义对象的:
    2. 语法:
      < import resource="其他配置文件的路径"/ >
    3. 关键字:"classpath:"表示类路径(class文件所在的目录),在spring的配置文件中要指定其他文件的位置,需要使用classpath,告诉spring到哪里去加载读取文件
      1. 加载文件列表:
        < import resource="classpath:ba02/spring_school.xml"/ >
        < import resource="classpath:ba02/spring_student.xml"/ >
      2. 在包含关系的配置文件,可以用通配符(* :表示任意字符)
        注意:主配置文件名称不能包含在通配符的范围内,不然会出现死循环
      3. 如果要用通配符,必须有一级目录
        < import resource="classpath:ba02/spring_*.xml"/ >

九.基于注解的di:

  1. 通过注解完成java对象创建,属性赋值
  2. 使用注解的步骤:
    1. 加入maven的依赖,spring-context,在你加入spring-context的同时,会间接加入spring-aop的依赖;
    2. 使用注解必须使用spring-aop依赖
    3. 在类中加入spring的注解(多个不同功能的注解)
    4. 在spring的配置中,加入一个组件扫描器的标签,说明注解在你的项目中的位置
    5. 使用注解方式,要在spring配置文件中添加"组件扫描器"(component-scan)
      1. component-scan的属性:
      2. base-package:指定注解在你的项目中的包名
      3. component-scan工作方式:spring会扫描遍历base-package指定的包和子包中所有类,找到类中注解安装注解功能创建对象,或给属性赋值:
      < context:component-scan base-package="com.my.ba01"/ >
      
    6. 获取对象和bean的方式一样
    7. 如何获取多个扫描器:
      1. 使用多次组件扫描器,指定不同的包
      2. 使用分隔符(;或,)分割多个包名
 <context:component-scan base-package="com.my.ba01;com.my.ba02"/ >

                        3. 指定父包com.my

  1. 要学习的注解:
    1. @Component:
      1. @Component:创建对象的,等同于的功能
      2. 属性:value就是对象的名称,就是bean的id值,value的值是唯一的,创建的对象在整个spring容器中就一个
      3. value是指定对象名称,value可以省略,不指定对象名称,由spring提供默认名称:类名的首字母小写
    2. @Repository
    3. @Service
    4. @Controller
  2. 每个注解开发的作用:
    1. @Repository(用来持久层类的上面):创建dao对象,用来访问数据库的
    2. @Service(用在业务层类的上面):创建Service对象,处理业务逻辑,可以有事务功能
    3. @Controller(用来控制器的上面):创建控制器对象的,接收请求,显示处理结果
    4. 以上三个注解的使用语法和@Component()一样都能创建对象,但这三个注解还有额外的功能
    5. @Repository @Service @Controller是给项目的对象分层的
  3. @Value:
    1. @Value:简单类型的属性赋值
    2. 属性:value是String类型的,表示简单类型的属性值
    3. 位置:
      1. 在属性定义上面,无需set方法,推荐使用
      2. 在set方法的上面
  4. @Autowired:
    1. 给引用类型赋值:
      1. spring中通过注解给引用类型赋值,使用的是自动注入原理,支持byName,byType
      2. @Autowired:默认使用的是byType自动注入
      3. 属性:required,是一个boolean类型的,默认是true
        1. required=true :表示引用类型赋值失败,程序报错,并终止执行
        2. required=false:引用类型如果赋值失败,程序正常执行,引用类型是null
      4. 位置:1.在属性定义的上面,无需set方法,推荐使用
                 2.在set方法的上面
      5. 如果要使用byName方式:(没有先后顺序)
        1. 第一步:在属性上面加入@Autowired(表示使用自动装配)
        2. 第二步:在属性上面加入@Qualifier(value=“id”):表示使用byName指定名称bean完成赋值
		@Autowired ( required =true )
		@Qualifier ( value="mySchool" )
		private School school ;
  1. @Resource:
    1. @Resource:来自jdk中的注解,spring框架提供了对这个注解功能支持,可以使用它给引用类型赋值,使用的也是自动注入原理,支持byName,byType, 默认是byName
    2. 位置:1.在属性定义的上面,无需set方法,推荐使用
             2.在set方式的上面
    3. 默认是byName:先使用byName自动注入,如果byName赋值失败,再使用byType
    4. @Resource只使用byName方式,需要增加一个属性 namename的值是bean的id(名称)
  2. 注解开发与配置文件开发:
    1. 配置文件缺点:代码量多,不够直观与清晰配置文件优点:代码分离,对于经常改的值非常有效
    2. 注解开发缺点:侵入性,代码与注解一起乱,不适合经常改动的代码注解开发优点:快捷,方便,生产力得到极大的提高,可读性好
  3. 在注解中使用${}:
    1. Spring配置文件中加入"加载属性配置文件":
    < context:property-placeholder location="classpath:类路径下要读取的配置文件"/ >
    2. 代码中的使用(key=value的形式来进行赋值):
		@ Value("${name}")
		private String name;
		@Value("${age}")
		private int age;

标签:SpringIOC,配置文件,对象,spring,笔记,注解,属性,IOC,赋值
来源: https://blog.csdn.net/zhangbaoboa/article/details/120962187

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有