一、Spring——IoC

IOC概述

  • Spring中IOC的概念,控制反转概念其实包含两个层面的意思,“控制”是接口实现类的选择控制权;而“反转”是指这种选择控制权从调用者转移到外部第三方或容器的手中。
  • BeanFactory、ApplicationContext和WebApplicationContext是Spring框架三个最核心的接口,框架中其他大部分的类都围绕他们展开、为他们提供支持和服务。在这些支持类中,Respurce是一个不可忽视的重要接口,框架通过Resource实现了和具体资源的解耦,不论他们位于何种存储介质中,都可以通过相同的实例返回。与Resource配合的另一个接口是ResourceLoader,ResourceLoader采用了策略模式,可以通过传入资源地址的信息,自动选择适合的底层资源实现类,为上层对资源的引用提供极大的便利。

一、IOC 控制反转:

  • 1、“控制”是指接口实现类的选择控制权;
  • 2、“反转”是指这种选择控制权从调用类转移到外部第三方类或者容器手里;

二、Spring三大最核心接口:

BeanFactory

  • 1、Spring框架的基础设施,面向Spring本身;
  • 2、在初始化容器时,并未实例化Bean,直到第一次访问某个Bean时才实例目标Bean;
  • 3、若需要对bean定义后处理器,必须在代码中通过手工调用spring方法进行注册;
  • 4、初始化方式
    new XmlBeanFactory(new Resource());

ApplicationContext

  • 1、面向使用Spring框架的开发者,几乎所有的应用场合我们都直接使用ApplicationContext文件中定义的 Bean;
  • 2、在初始化应用上下文时就实例化所有的单例的Bean
  • 3、若需要对bean定义后处理器,其会利用反射机制自动识别出配置文件中的Processor,并自动注册到应用上下文中
  • 4、初始化方式
new ClassPathXmlApplication("classpath:bean.xml") 
 new FileSystemXmlApplicationContext("file:beans.xml")
new AnnotationConfigApplicationContext(Beans.class)

WebApplicationContext

  • 1、WebApplication需要ServletContext实例,也就是说他必须要在拥有Web容器的前提下才能完成启动工作。
  • 2、Spring分别提供了用于启动WebApplicationConetext的Servlet和Listener,在web.xml中配置
  • 3、WebApplicationContext需要使用日志功能,用户可以将Log4j配置文件放到类路径 WEB-INF/classes下,这时Log4j引擎即可顺利启动。用户可以在web.xml中通过Log4jConfigServlet和Log4jConfigListener指定Log4j配置文件位置,但要注意启动顺序(load-on-startup)
  • 4、使用标注@Configuration的java类提供信息,contextClass、contextConfigLocation

三、Bean生命周期改变方式:

  • 1、<bean>中的init-method 和 destroy-method 这两个属性为Bean指定初始化和销毁的方法
  • 2、InitDestroyAnonotationBeanPostProcessor 的 @PostConstruct、@PreDestroy

Spring 配置概述:

  • 用户可以通过属性注入、构造函数注入的方式建立Bean和Bean的依赖;可以通过字面值的方式设置Bean的属性,也可以通过ref引用容器中其他的Bean;Spring为集合类提供了专门的配置标签;
  • 使用Spring简化配置方式可以让配置文件更加紧凑;可以通过配置文件中的<bean>标签建立关联、继承、依赖、引用的关系,合理地使用这些关系可以简化配置、提高配置质量;
  • Spring提供了5个Bean作用范围,在Web应用环境下,可以使用request、 session和globalSession的Bean作用域;
  • 通过@Component及另外三个衍型注解(@Repository、@Service、@Controller)配合@Autowired就可以很好地使用基于注解的配置进行Bean的定义和注入,这种方式比在XML文件中通过<bean>提供配置文件更加简单;
  • 任务POJO标注了@Configuration注解后就可以为Spring容器提供Bean的定义信息,在类方法中标注@Bean相当于定义了一个Bean,同时还提供了Bean的实例化逻辑。由于Bean的实例化逻辑是在方法中定义的,因此他可以应对一些复杂的Bean的实例化场景。
  • 不管配置使用何种配置方式,Spring都可以很好地将他们整合起来,在Spring容器内部,这些不同方法的Bean定义信息是大体相同的,三者指甲并不存在谁替代谁的问题,他们都有自己最合适的应用场合。

一、Spring容器高层视图

Bean的实现类
Bean的属性信息,数据库连接数、用户名、秘密
Bean的依赖
Bean的行为配置

二、基于XML的配置

  • 1、 schema格式
<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns.xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns.aop="http://www/springframework.org/schema/aop"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/beans/spring-aop-3.0.xsd 
    ">
    <!--默认命名空间的配置-->
    <bean id="a" class=""/>

    <!--aop命名空间的配置-->
    <aop:config>
    </aop:config>
</beans>
  • 2、依赖注入

    • 1、属性注入
    • 2、构造函数注入:
      按照类型匹配入参;
      按照索引匹配入参;
      联合使用类型个索引匹配入参;
      通过自身类型反射匹配入参;
    • 3、工厂方法注入:非静态工厂方法;静态工厂方法

    由于Spring IoC容器以框架的形式提供工厂方法的功能,并以透明的方式开放给开发者,所以很少需要手工编写基于工厂方法的类。不过在一些遗留系统或第三方类库中,我们还会碰到工厂方法,这时用户可以使用Spring工厂方法注入的方式进行配置。

    • 4、方法注入。
      lookup方法注入 无状态Bean的作用域一般配置为singletion单实例模式,如果我们往singletion的类A中注入prototype的类B,并希望每次调用A的getB()都能返回一个新的B,使用传统的注入方法无法实现这样的要求。使用lookup方法注入可以实现方法替换,可以使用Bean的方法去替换另一个Bean的方法。
  • 3、注入参数详解

    • 1、字面值
    • 2、引用其他Bean
    • 3、内部Bean
    • 4、null值 <value></value>
    • 5、级联属性 <property name="a.b.c" value="">
    • 6、集合类型属性
  • 4、简化配置方式

    • 1、字面值属性
    • 2、引用对象属性
    • 3、使用p命名空间
    • 4、自动装配
  • 5、bean之间的关系

    • 1、继承
    • 2、依赖
    • 3、引用
  • 6、整合多个配置文件

    • 1、在启动Spring容器时,通过一个Spring数组来指定这些配置文件;
    • 2、应用层面提供一个整合的配置文件,通过<import>将各个模块整合起来,这样容器在启动时,只需要关注这个整合的配置文件就可以了;
  • 7、Bean的作用域

    • 1、singleton

    一般情况下,无状态或者状态不可变的类适合使用单例类。在传统开发中,由于Dao类执有Connection这个非线程安全的变量而没有采用单例模式。而在Spring环境下,对于所有的Dao类都可以采用单实例模式,因为Spring利用AOP和LocalThread的功能,对非线程安全的类的变量(或称状态)进行了特殊的处理,使这些非线程安全的类变成线程安全的类。

    • 2、prototype
    • 3、request
    • 4、session
    • 5、globalSession
  • 8、FactoryBean。实例化Bean得过程如果比较复杂,可以使用Spring提供的 org.springframework.beans.factory.FactoryBean工厂类接口定制实例化Bean的逻辑

三、基于注解的配置

  • 1、注解:

    • @Compoment: Spring容器自动将POJO转换为容器管理的Bean;
    • @Repository: 用于对Dao实现类进行标注;
    • @Service:用于对Service实现类进行标注;
    • @Controller:用于对Controller实现类进行标注
  • 2、使用注解配置信息启动Spring容器。声明context命名空间,扫描类包以应用注解定义的Bean
    <context:component-scan base-package="">

  • 3、自动装配Bean

    • 通过@Autowired进行自动注入
    • 使用@Auto的required属性
    • 使用@Qualifier指定注入Bean的名称
    • 对类方法进行标注
    • 对集合类进行标注
    • 对标准注解的支持
      @Resource 自动采用标注处的变量名或方法名作为Bean的名称
      @Inject
  • 4、Bean作用范围及生命过程方法

    • @Scope指定Bean的作用范围
    • @PostConstruct @PreDestory改变Bean的生命过程

四、基于Java类的配置

  • 1、使用Java类提供Bean定义信息

    • 普通POJO只要标注@Configuration注解,就可以为Spring容器提供Bean定义的信息了
  • 2、使用基于Java类的配置信息启动Spring容器

    • 使用AnnotationConfigApplicationContext
    • 通过XML配置文件引用@Configuration的配置 <context:component-scan base-package="" resource-pattern=".class">
    • 通过 Configuration配置类引用XMl配置信息 @ImportResurce
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容