Spring学习笔记(一)IOC

Spring是一个基于IOC和AOP的结构J2EE系统的框架
  • IOC 反转控制(DI依赖注入):有spring框架提供资源,而不是自己主动去获取(new),依赖容器注入
  • AOP 即 Aspect Oriented Program 面向切面编程
Spring框架的组成结构图如下所示:

在这里插入图片描述

Spring的核心机制

Bean的配置

  • 配置形式:基于xml文件、基于注解
  • 配置方法:通过全类名(反射),通过工厂方法、FactoryBean
  • 依赖注入方式:属性注入、构造器注入
  • 管理方法:程序主要是通过Spring容器来访问容器中的Bean,ApplicationContext是Spring容器最常用的接口,该接口有如下两个实现类:
    • ClassPathXmlApplicationContext: 从类加载路径下搜索配置文件,并根据配置文件来创建Spring容器。
    • FileSystemXmlApplicationContext: 从文件系统的相对路径或绝对路径下去搜索配置文件,并根据配置文件来创建Spring容器。
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

		Person p = (Person) context.getBean("pp");//pp为设置的id
依赖注入

Spring框架的核心功能有两个:

  • Spring容器作为超级大工厂,负责创建、管理所有的Java对象,这些Java对象被称为Bean。
  • Spring容器管理容器中Bean之间的依赖关系,Spring使用一种被称为"依赖注入"的方式来管理Bean之间的依赖关系。

设值注入
设值注入是指IoC容器通过成员变量的setter方法来注入被依赖对象。这种注入方式简单、直观,因而在Spring的依赖注入里大量使用。
构造注入
利用构造器来设置依赖关系的方式,被称为构造注入。通俗来说,就是驱动Spring在底层以反射方式执行带指定参数的构造器,当执行带参数的构造器时,就可利用构造器参数对成员变量执行初始化——这就是构造注入的本质。

Bean配置文件(applicationContext.xml)
	//属性注入
   <bean id="idd"  class="com.cc.Person">
   		<property name="name"  value="jia"></property>
   		<property name="age"  value="12"></property>
   </bean>
   //构造器注入
   <bean id="idd"  class="com.cc.Person">
   		<constructor-arg value="jia"></constructor-arg>
   		<constructor-arg value="12"></constructor-arg>
   </bean>

对应的Java文件为

public class Person {

	private String name;

	private int age;
	
	还有get/set方法
}

Bean内也可以注入其他对象,配置时使用ref

<bean id="idd"  class="com.cc.Person">
   		<property name="name"  value="jia"></property>
   		<property name="age"  value="12"></property>
   		<property name="dog"  ref="gouer"></property>
   </bean>
   <bean id="gouer" class="com.cc.Dog">
   		<property name="name"  value="xiaogou"></property>
   </bean>

成员为集合时使用list属性

   		<property name="dog"  >
   				<list >
   						<ref bean="dog1"/>
   						<ref bean="dog2"/>
   				</list>
   		</property>

成员为Map时使用map属性

   		<property name="dog"  >
   				<map >
   						<entry key="AA" value-ref="dog1"/>
   						<entry key="BB" value-ref="dog2"/>
   				</map>
   		</property>

配置properties属性

   		<property name="properties"  >
   				<props >
   						<prop key="user" >root</prop>
   						<prop key="password" >123123</prop>
   				</props>
   		</property>
自动装配

Spring能自动装配Bean与Bean之间的依赖关系,即无须使用ref显式指定依赖Bean,而是由Spring容器检查XML配置文件内容,根据某种规则,为调用者Bean注入被依赖的Bean。

//byNmae和byType两种
    <bean id="idd"  class="com.cc.Person"
    		p:name=""  autowire="byName">
   </bean>
继承Bean配置

子Bean继承父Bean,包括属性配置,可以覆盖配置
若父Bean只是作为模板使用,可设<bean≥的abstract属性为true;
父Bean的class属性可以忽略;

Spring容器中的Bean

对于开发者来说,开发者使用Spring框架主要是做两件事:①开发Bean;②配置Bean。对于Spring框架来说,它要做的就是根据配置文件来创建Bean实例,并调用Bean实例的方法完成"依赖注入"——这就是所谓IoC的本质。
容器中Bean的作用域
当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。Spring支持如下五种作用域:
bean中属性 scope=" "

  • singleton: 单例模式,在整个Spring IoC容器中,singleton作用域的Bean将只生成一个实例。
  • prototype: 每次通过容器的getBean()方法获取prototype作用域的Bean时,都将产生一个新的Bean实例。
  • request: 对于一次HTTP请求,request作用域的Bean将只生成一个实例,这意味着,在同一次HTTP请求内,程序每次请求该Bean,得到的总是同一个实例。只有在Web应用中使用Spring时,该作用域才真正有效。
  • session:该作用域将 bean 的定义限制为 HTTP 会话。 只在web-aware Spring ApplicationContext的上下文中有效。
  • global session: 每个全局的HTTP Session对应一个Bean实例。在典型的情况下,仅在使用portlet context的时候有效,同样只在Web应用中有效。

如果不指定Bean的作用域,Spring默认使用singleton作用域。prototype作用域的Bean的创建、销毁代价比较大。而singleton作用域的Bean实例一旦创建成果,就可以重复使用。因此,应该尽量避免将Bean设置成prototype作用域。

SpEL运算符

SpEL是一个支持运行时查询和操作对象图的强大的表达式语言。
SpEL使用#{…}座位定界符,在大括号中的字符是SpEL。
SpEL里可以使用Java语句

Bean的生命周期方法

Spring IOC 容器对 Bean 的生命周期进行管理的过程:

  • 通过构造器或工厂方法创建 Bean 实例
  • 为 Bean 的属性设置值和对其他 Bean 的引用
  • 调用 Bean 的初始化方法
  • Bean 可以使用了
  • 当容器关闭时, 调用 Bean 的销毁方法

在 Bean 的声明里设置 init-methoddestroy-method 属性, 为 Bean 指定初始化和销毁方法.

Spring的"零配置"支持

注解

Spring提供如下几个Annotation来标注Spring Bean:

  • @Component: 标注一个普通的Spring Bean类
  • @Controller: 标注一个控制器组件类
  • @Service: 标注一个业务逻辑组件类
  • @Repository: 标注一个DAO组件类

配置文件
指定容器扫描的包

<context:component-scan base-package="要扫描的基类包和子包"/>

其他扫描模式
如果仅希望扫描特定的类而非基包下的所有类,可使用 resource-pattern 属性过滤特定的类,示例:

<context:component-scan 
			base-package="要扫描的包"
			resource-pattern="autowire/*.class"/>

筛选器选择

  • <context:include-filter> 子节点表示要包含的目标类,在主标签设置use-default-filters="false",就只使用该筛选器扫描
  • <context:exclude-filter> 子节点表示要排除在外的目标类

<context:component-scan> 下可以拥有若干个 <context:include-filter><context:exclude-filter> 子节点

<context:component-scan 
			base-package="要扫描的基类包和子包">
			<context:exclude-filter type="annotation" expression="筛选包"/>
</context:component-scan>
@Autowired

默认情况下, 当 IOC 容器里存在多个类型兼容的 Bean 时, 通过类型的自动装配将无法工作. 此时可以在 @Qualifier 注解里提供 Bean 的名称. Spring 允许对方法的入参标注 @Qualifiter 已指定注入 Bean 的名称

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值