【搞定spring】视屏课1-IOC

2002 Rod Johnon <Expoer One-on-one j2eedevelopment and Design>
Spring  2003  ,IOC  Aop
Spring data,spring boot,spring cloud,spring framework ,spring social 

IOC :控制反转 (DI:依赖注入)

1.搭建Spring环境


下载jar
http://maven.springframework.org/release/org/springframework/spring/
spring-framework-4.3.9.RELEASE-dist.zip //
开发spring至少需要使用的jar(5个+1个):
spring-aop.jar        开发AOP特性时需要的JAR
spring-beans.jar    处理Bean的jar            <bean>
spring-context.jar    处理spring上下文的jar        <context>
spring-core.jar        spring核心jar
spring-expression.jar    spring表达式 
三方提供的日志jar
commons-logging.jar    日志

2.编写配置文件

为了编写时有一些提示、自动生成一些配置信息:
方式一:增加sts插件
可以给eclipse增加 支持spring的插件:spring tool suite(https://spring.io/tools/sts/all)
下载springsource-tool-suite-3.9.4.RELEASE-e4.7.3a-updatesite.zip,然后在Eclipse中安装:Help-Install new SoftWare.. - Add

方式二:
    直接下载sts工具(相当于一个集合了Spring tool suite的Eclipse): https://spring.io/tools/sts/

配置文件:新建:bean configuration .. - applicationContext.xml


3.开发Spring程序(IOC)

        ApplicationContext conext = new ClassPathXmlApplicationContext("applicationContext.xml") ;
        //执行从springIOC容器中获取一个 id为student的对象
        Student student = (Student)conext.getBean("student") ;
可以发现,springioc容器 帮我们new了对象,并且给对象赋了值

SpringIOC发展史:


1.最开始用new:缺点:每用一次就要创建一次,而且到处new,会导致不好维护


Student student = new Student();
student.setXxx();

2. 简单工厂:通过工厂来创建对象,后期就好维护new,通过简单工厂,可以讲new集中起来操作

缺点:需要自己写

3.ioc (超级工厂):可以容纳任何对象

优势:IOC(控制反转)也可以称之为DI(依赖注入):
控制反转(反转的是获取对象的方式,由自己创造new,变成从容器里拿):将 创建对象、属性值 的方式 进行了翻转,从new、setXxx()  翻转为了 从springIOC容器getBean()
依赖注入:将属性值 注入给了属性,将属性 注入给了bean,将bean注入给了ioc容器;


总结:ioc/di ,无论要什么对象,都可以直接去springioc容器中获取,而不需要自己操作(new\setXxx())

因此之后的ioc分为2步:1 先给springioc中存放对象并赋值   2 拿


DI:依赖注入 ,
Teacher  

Course  : cname  teacher

IOC容器赋值:如果是简单类型(8个基本+String),value; 
    如果是对象类型,ref="需要引用的id值",因此实现了 对象与对象之间的依赖关系


conext.getBean(需要获取的bean的id值)

依赖注入3种方式:


1.set注入:通过setXxx()赋值

赋值,默认使用的是 set方法();
依赖注入底层是通过反射实现的。
<property...> 实质是调用的setXxx方法


2.构造器注入:通过构造方法赋值


 <constructor-arg value="ls" type="String" index="0" name="name"></constructor-arg>
需要注意:如果  <constructor-arg>的顺序 与构造方法参数的顺序不一致,则需要通过type或者index或name指定。【如果完全一致,那么不需要这些,只需要value即可】

3.p命名空间注入


引入p命名空间
    xmlns:p="http://www.springframework.org/schema/p"

<bean id="student" class= "org.lanqiao.entity.Student" p:stuNo="12" p:teacher-ref="teacher" p:name="zhaojing"> 

简单类型:
    p:属性名="属性值"
引用类型(除了String外):
    p:属性名-ref="引用的id"
注意多个 p赋值的时候 要有空格。


注意:
无论是String还是Int/short/long,在赋值时都是 value="值" ,
因此建议 此种情况 需要配合 name\type进行区分

示例:
    注入各种集合数据类型: List  Set map properties

set、list、数组   各自都有自己的标签<set> <list> <array>,但是也可以混着用


给对象类型赋值null :
        <property name="name" >  
                <null/>       -->注意 没有<value>
        </property>
赋空值 ""  
        <property name="name" >  
                <value></value>  
        </property>

在ioc中定义bean的前提:该bean的类 必须提供了 无参构造

4、自动装配(只适用于 ref类型 ):约定优于配置


自动装配:
<bean ... class="org.lanqiao.entity.Course"  autowire="byName|byType|constructor|no" >  byName本质是byId
byName:  自动寻找:其他bean的id值=该Course类的属性名
byType:  其他bean的类型(class)  是否与 该Course类的ref属性类型一致  (注意,此种方式 必须满足:当前Ioc容器中 只能有一个Bean满足条件  )
constructor: 其他bean的类型(class)  是否与 该Course类的构造方法参数 的类型一致;此种方式的本质就是byType


可以在头文件中 一次性将该ioc容器的所有bean  统一设置成自动装配:
<beans xmlns="http://www.springframework.org/schema/beans"
...
default-autowire="byName">

自动装配虽然可以减少代码量,但是会降低程序的可读性,使用时需要谨慎。

5、使用注解定义bean:通过注解的形式 将bean以及相应的属性值 放入ioc容器,然后要进行扫描

<context:component-scan base-package="org.lanqiao.dao">
</context:component-scan>Spring在启动的时候,会根据base-package在 该包中扫描所有类,查找这些类是否有注解@Component("studentDao"),如果有,则将该类 加入spring Ioc容器。

@Component细化:

dao层注解:@Repository
service层注解:@Service
控制器层注解:@Controller


 

猜你喜欢

转载自blog.csdn.net/ZHAOJING1234567/article/details/90181442