IOC&&DI

解耦

降低程序间的依赖关系.应该做到编译期不依赖,运行时才依赖.
解耦的思路:
1.使用反射来创建对象,避免使用new关键字,
2.通过读取配置文件来获取要创建对象的全限定类名.

service,dao,ui(client)解耦

工厂模式解耦

  • 创建Bean对象的工厂
  • Bean指可重用组件.
  • service可以被很多servlet使用,dao可以被很多service使用.所以就是创建我们的service和dao对象.
  • 同上,要配置文件创建对象的全限定类名.然后反射创建对象,步骤代码如下.先加载配置文件,用classLoader来加载.通过beanName获取配置文件中bean对象的全限定类名,然后用反射创建对象.
    在这里插入图片描述
    上面的bean是多例对象,要把bean对象设计成为一个单例对象.单例对象虽然存在线程安全问题,但我们很少包含可修改的类成员.只需要newInstance一次对象即可.使用静态代码块,后面的因为要用前面的bean,所以要存储newInstance()出来的bean.用Map容器进行存储.private static Map<String,Object> beans.然后在静态代码块中加载配置文件,实例化容器,将配置文件的key,以及反射对象放入容器中.
    在这里插入图片描述
    获取对象的getBean()方法就可以直接如下:
public static Object getBean(String beanName){
	return beans.get(beanName);
}

IOC(Inversion Of Control)控制反转

而以上的通过工厂模式来解耦,使最初的APP直接访问各个资源到现在的APP通过工厂获取资源.控制权由以前自己控制,转到了由工厂控制,这就是IOC,控制反转.现在由工厂控制资源,提供资源.
所以IOC的作用就是***降低程序间的耦合(依赖关系)***

Spring基于XML的IOC

步骤:

  1. resources下写bean.xml.写如:<bean id="accountService" class="com.hk.service.imp.AccountServiceImp"></bean> 同上述的工厂模式的配置文件,就是工厂要创建的bean对象的全限定类名.
  2. 获取bean对象.首先要获取核心容器对象.ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml"); ApplicationContext有三种常用的实现类。
  3. 根据id获取bean对象.InAccountService as = (InAccountService)ac.getBean("accountService");或者InAccountDao ad = ac.getBean("accountDao",InAccountDao.class);
ApplicationContext的三个实现类.
  1. ClassPathXmlApplicationContext:加载类路径下的配置文件,要求配置文件在类路径下.(1,3常用)
  2. FileSystemXmlApplicationContext:可以加载磁盘任意路径下的配置文件(必须有访问权限).
  3. AnnotationConfigApplicationContext:用于读取注解创建容器.
核心容器两个接口

在这里插入图片描述
ApplicationContext:立即创建,所以单例模式适用,因为只用开始时创建一次. 常用此接口.
BeanFactory:多例对象适用. 是顶层接口.

Spring对bean的管理细节.

创建bean的三种方式.
  1. 使用默认构造函数创建.
    当使用bean标签,属性只有id和class属性时,采用的是默认构造函数创建bean对象,此时若类中没有默认构造函数,则对象无法创建.比如要创建的是AccountServiceImp的bean对象,在类中,吧构造函数加个参数,而不写默认构造函数,此时类中就没有了默认构造函数,现在核心容器获取不了bean对象.

----------下面的2,3种方式存在的原因是,类可能存在于jar包中,我们无法无法修改源码提供默认构造函数-----------

  1. 使用普通工厂中的方法创建
    普通工厂的class全限定类名得不到要创建的bean对象,要得到的对象是工厂的方法返回值.所以要分两步,第一步,用全限定类名找到工厂,然后通过工厂的方法获取对象.
<bean id="AFactory" class="com.hk.factory.AFactory"></bean>
<bean id="AService" factory-bean="AFactory" factory-method="getAService"></bean>
  1. **使用工厂中的静态方法创建对象 **
<bean id="AStaticFactory" class="com.hk.factory.AStaticFactory" factory-method="getAService"></bean>
bean的作用范围

bean的scope属性 作用:用于指定bean的作用范围.
取值:
singleton 单例(默认值)
prototype 多例
request:作用域web应用的请求范围.
session: 作用于web应用的会话范围
global-session: 作用于集群会话范围(全局会话范围)

bean的生命周期
  • 单例对象:单例对象生命周期和容器相同,随容器生,随容器灭.
  • 多例对象:获取bean对象的时候才会创建初始化,而单例对象是在容器创建时就初始化了.对象还在使用中就一直活着. 当对象长时间不用,且没有别的对象引用时,由java的垃圾回收器回收.

DI(Dependency Injection)

依赖关系的管理:交由spring来维护. 要用其他类的对象时,由spring为我们提供,我们只需在配置文件中说明.依赖关系的维护就称之为依赖注入.
依赖注入能注入的数据有三类:基本类型和String ; 其他bean类型 ; 复杂类型/集合类型.
注入的方式有三种: 使用构造函数提供 ; 使用set方法提供 ; 使用注解提供

注入方式.
  • 构造函数注入:带参构造函数(arg1,arg2,…)给这些参数赋值. (一般情况下不用)

    • 修改了构造函数,没提供默认构造函数,这里要在bean标签内部使用constructor-arg标签.标签中的属性有5个.
    • type:注定要注入的数据的数据类型 如:java.lang.String,但是如果参数有多个String类型,则不好使.
    • index:给参数索引位置的参数赋值.从0开始.
    • name:给指定名称的参数赋值 √
      --------------------------------------上述是给构造函数指定参数赋值,直接用name-------------------------
    • xml里面的赋值类型都是字符串,虽然给"18",spring也能自动转为Integer.但如Date类型,给"1997-07-07"这样就不行,传过去的只是一个字符串.
    • value:用于提供基本类型和String类型的数据
    • ref:用于指定其他的bean类型数据,指的是在spring的Ioc容器中出现过的bean对象.比如上述Date类型.需要在xml中用<bean id="now" class="java.util.Date"></bean>来把Date的bean对象加到Ioc容器中,然后赋值时用<constructor-arg name="birthday" ref="now"></constructor-arg>来注入数据.
    • 如果3个参数,只需要用2个,也需要提供3个.所以在一般情况下不使用该方式.
  • Set方法注入 [更常用]

    • 涉及的标签, property
    • 出现的位置,bean标签的内部.
    • 标签的属性:
      1. name:指定注入时所调用的set方法名称. 如:变量为name 而set方法为setUserName(…) 则name应该为:“username” 去掉set,写后面的名称,且改为小写.
      2. value:同上,基本类型和String类型
      3. ref:同上.定义的其他bean类型.
    • 优势:创建对象时没明确的限制,不用带参构造函数.
    • 缺点:如果某个成员必须有值,则set方法无法保证一定注入. [恰好都与构造方法注入相反]
  • 注入集合数据 只能用这个方式,注解方式注入不了.

  • 同样用set方法注入.但property标签里只有name,value,ref.需要在property内部使用标签.

  • 会有array,list,map,set,props等标签,

  • 用于给List结构注入的标签有:list,array,set

  • 用于给map结构注入的标签:map,props

  • ***总结:只要结构相同,就都可以用 所以只需记两种,list,map ***

---------List标签-----
<list>
	<value>AA</value>
	<value>BB</value>
</list>
---------map标签-------
<map>
	<entry key="aaa" value="bbb"></entry>
	<entry key="ccc" value="ddd"></entry>
</map>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值