Spring IOC学习笔记

java 反射机制是IOC的底层实现,IOC是spring容器的内核,AOP,声明式事务管理都是在此基础上发展的。

IOC:某一接口具体实现类的选择控制权从调用类中移除,转交第三方决定,DI是依赖注入,是和IOC一样的:
DI:让调用类对某一接口实现类的依赖关系由第三方注入,以移除调用类对某一接口实现的依赖。
Eg:在演员,剧本,角色中 ,本来演员是直接依赖角色和剧本的,用IOC之后,也就是多出来一个导演,他直接选角色,这样可
分离剧本和演员。


所谓依赖注入就是指:在运行期间,有外部容器动态地将依赖对象注入到组件中
IOC三种注入方法(属性注入,构造器注入,接口注入)
  1. setter方法注入,也叫属性注入方法,是指在类中定义所有演员的setget方法,这样当某一集是其他角色是可以通过这种方法很好的得到。
<span style="font-size:18px;"><bean id ="用来调用的" class="com.test.spring.Person">
        <property name="name" value="LYW"/>
        <property name="age" value="21"/>
    </bean></span>

<span style="font-size:18px;">public class Direct{   //导演类
     public void direct()
           角色  geli = new 刘德华();  //指定角色的扮演者
           剧本 juben = new 剧本(geli); //注入具体扮演者到剧本
            ..................}}</span>


  1. 使用构造器注入
<span style="font-size:18px;"><bean id="person" class="com.test.spring.Person
        <constructor-arg name="name" value="LYW" />
         <constructor-arg name="age" value="21" />
      </bean></span>

<span style="font-size:18px;">public class Direct{   //导演类
     public void direct()
           角色  geli = new 刘德华();  //指定角色的扮演者
           剧本 juben = new 剧本(); //注入具体扮演者到剧本
           juben.setGeli(geli);//set注入方式
            ..................}}</span>


3.接口注入:将调用类所依赖的方法抽取到一个接口中,调用类通过实现对应的接口提供相应的方法。
     
<span style="font-size:18px;">public interface ActorArrange{  void injectGeLi(GeLi geli) ;}
     public class 剧本implements ActorArrange{   在这里边实现injectGeLi方法。}
       public class Direct{   //导演类
     public void direct()
           角色  geli = new 刘德华();  //指定角色的扮演者
           剧本 juben = new 剧本(); 
            jubne.injectGeLi(geli);
            ..................}}</span>

通常,这种方式效果和属性注入没有区别,而且还多出来一个接口类,所以不建议使用。


资源加载
spring 设计了一个Resource接口,提供更强的访问底层资源的能力。有了这个类可以将配置文件写在任何位置。
  该接口主要的方法:
           boolean exists(): //    资源是否存在
          boolean isOpen()://资源是否打开
          URL getURL()throws IOEXception,File getFile();InputStream getInputStream();getFileName()
该接口对应不同的实现类:
          AbstractResource 接口------->实现类有----》ByteArrayResource  ClassPathResource(类路径的方式)  FileSystemResource(绝对路径进行访问)   ServletContextResource (相对于web根目录的方式)  UrlResources
..........
还有就是用资源地址表达式

classpath:    -->表示从类路径中加载,和classpath:/是等价的
classpath*:--->假设有多个相同的jar在一个包中,用这种方法会加载包写所有的文件,上边的只会加载第一个
file:      --->使用URLResource从文件系统中加载
http://  ftp:  //--->从WebFTP
没有前缀的,直接写:---》根据applicationContext具体实现类采用类对应的Resource


BeanFactory 和ApplicationContext

spring通过配置文件描述bean与bean之间的依赖关系,利用Java语言的反射机制能实例bean并且建立依赖关系,
spring除了这些还提供 了bean实例的缓存,生命周期的管理。bean实例代理,事件发布,资源转载等高级服务。


bean工厂,也叫IOC容器(com.springframework.beans.factory.BeanFactory)是spring框架最核心的接口,他提供了高级IOC的配置机制。
BeanFactory使管理不同类型的Java对象成为可能。BeanFactory面向spring本身
应用上下文也叫spring容器:(com.springframework.context.ApplicationContext),建立在BeanFactory的基础上,提供更多的面向应用的功能,国际化支持和框架事务。面向的是开发者。

BeanFactory:
BeanFactory接口最常用的实现是:XMLBeanFactory。最主要的方法是:getBean(String name);
BeanDefinitionRegister:spring配置文件中每一个《bean》节点元素在spring容器里都通过一个BeanDefinition对象表示,它描述了bean的配置信息。而这个类提供了想容器手工注册BeanDefinition的方法。

初始化BeanFactory


XMLBeanFactory是通过Resource装载spring配置信息并启动IOC容器。通过BeanFactory启动容器时,并不会初始化配置文件中定义的bean,初始化动作发生在第一次调用,对于单例的bean来说,BeanFactory会缓存beans实例,所以第二次调用的时候获取bean是直接从IOC容器缓存中获取。
Spring在DefaultSingletonBeanFactory类中提供了一个用于缓存单例bean的缓存器,用HashMap实现的。

ApplicationContext:
ApplicationContext的主要实现类是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext前者默认从类路径加载配置文件,后者从文件系统加载。
ApplicationContext的初始化和BeanFactory的区别:前者要实例化所有单例bean,后者使用的时候才会实例化

spring支持用注解的方式配置。
@Configuration//表示是一个配置信提供类
@Bean(name="Car") //定义一个bean

spring为基于注解的配置提供了专门的AnnotationConfigApplicationContext类。

WebApplicationContext是专门为WEb应用准备的,它允许从web根目录的路径中转载配置文件并完成初始化工作。可以从他中获得ServletContext的引用。
spring为WebApplicationContext中的bean提供了三个新的作用域:request,session,global session 而在非WEB下,只有singleton和prototype。

初始化:和上边两个不同,因为WebApplicationContext需要ServletContext实力,所以必须在有web容器的情况下进行实例。
解决的办法是:在web.xml中配置自启动的servlet或者定义问容器监听类(ServletContextListener)
spring分别提供了用于启动WebApplicationContext的Servlet和web容器监听器:
<span style="font-size:18px;"><context-param>
     <param-name>contextConfigLocation</>
     <param-value>/WEB_INF/taotaoao.xml</>
</>
<listener>
     <listener-class>aor.springframework.web.context.ContextLoaderListener</>
</></span>




Bean作用域

BeanFactory中bean的生命周期:也会经历实例化,设置属性值和返回实例:
如果在<bean scope="prototype">/会将bean返回给调用者,调用者自己管理。
<bean scope="singleton">//容器自己管理,当容器关闭时,将会触发触发视频日你个对其进行管理。

bean 的 配置方式有三种:
基于XMl的,基于注解的,基于java 类的。

Bean的基本配置
<bean id="only" class="">
注意上边的ID必须是唯一的,而且命名的时候不能出现特殊符号
<bean name="#first,second,third" class>
这种方法可以用多个名字,而且可重复,当重复的时候 返回的是最后声明的那个,可以出现?等其他字符

注意:javabean关于属性命名有一个特殊的规定:spring锁配置中的属性名都是以小写字母开头,要用大写的话要必须保证要么前两个字母是小写,要么前两个字母都大写
否则会 报错
<span style="font-size:18px;"><bean id ="" calss="">
     <property name="name" value="guwen">
     <property name="car" ><ref bean =""/></>
       <property>
          <list>
               <value>属性</><value>属性2</><value>属性3</>         
          </>
          <set>
                <value>看包</><value>看包2</><value>看包3</>        
          </>
          <map>
               <entry>
                    <key>hah</><value>hsh</>
               </entry>
          </map>
</property></span>



 自动装配
<bean id="" class="" autowire="byName/byType/constructor/autodetect">

bean的作用域
singleton:在IOC容器中仅存在一个bean实例,以单例存在,默认情况下,ApplicationContext在加载的时候会实例化所有的bean,
                然后缓存,要想不这样用     <lazy-init="true">
prototype:每次从容器中调用bean时都返回一个新的实例。
request:每次http请求都会创建一个新的bean,该作用域仅适用于WEBApplicationcontext
session;同一个Http session 共享一个bean,不同http session是不同的bean,该作用域仅适用于WEBApplicationcontext
globalSession:同一个全局Session共享一个bean,该作用域仅适用于WEBApplicationcontext
@Scope可以显示的在配置作用范围,

基于注解的配置:

1.使用注解定义bean
@Component,被spring识别,将pojo转化为容器管理的bean
在这个的上边还可以有下面三个:
@Repository:对于DAO实现类的注解
@Service:对Service实现类的注解
@Controller:对Controller实现类的注解

自动装配bean:
@Autowired进行自动注入,有一个属性是required:默认是没有找到bean就抛出NoSuchBeanDefinitionException,要想不抛出用required=false
@Qualifier :指定注入bean的名称,当有两个bean时,返回Qualifier中的名称的bean
@Resource:要求提供一个bean名称的属性:
@Inject:和Autowired类似,按照类型匹配注入bean,只是没有required属性

基于Java类的配置信息:
javaConfig:是spring的一个子项目,它可以通过Java类的方法提供bean的定义信息;
@Configuration
public class Test{
     @Bean
     public UserDao userDao(){}
     @Bean.......
}

IOC工作流程:
1.ResourceLoader从存储介质中加载spring的配置信息,并使用Resource表示这个配置文件的资源
2.BeanDefinitionReader读取Resource所指向的配置文件资源,然后将配置文件中每一个<bean>解析为一个BeanDefinition对象,并保存到                     BeanDefinitionRegister注册表中。
3.扫描BeanDefinitionRegister注册表中的信息,使用Java反射机制自动识别bean工厂处理器的bean,并且进行加工(完成含有占位符的标签解析,完成属性的配置)
4.spring容器从注册表中取出加工后的BeanDefinition,并进行实例化


下一篇写AOP,安啦..............

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值