spring学习笔记

Spring是一个基于IOC和AOP的结构J2EE系统的框架
IOC 反转控制 是Spring的基础,Inversion Of Control
简单说就是创建对象由以前的程序员自己new 构造方法来调用,变成了交由Spring创建对象
DI 依赖注入 Dependency Inject. 简单地说就是拿到的对象的属性,已经被注入好相关值了,直接使用即可。
(1)spring是一个容器框架,他将我们需要使用的service,dao放在里面,我们需要使用的时候就可以直接取出来,不用每次都去new,如果每次都去new,每次都会生成一个新的对象。spring是一个大工厂,专门负责创建bean
(2)spring支持声明式的事务,只需要通过配置就可以完成对事务的管理,无需手动编程。
(3)spring方便很多框架的集成
Spring 框架是一个分层架构,它包含一系列的功能要素并被分为大约20个模块。这些模块分为Core Container、Data Access/Integration、Web、AOP(Aspect Oriented Programming)、Instrumentation和测试部分,如下图所示:
在这里插入图片描述

Spring的核心jar包:

spring-core-3.2.2.RELEASE.jar
包含Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心。

spring-beans-3.2.2.RELEASE.jar
所有应用都要用到的,它包含访问配置文件、创建和管理bean
以及进行Inversion of Control(IoC) / Dependency Injection(DI)操作相关的所有类

spring-context-3.2.2.RELEASE.jar
Spring提供在基础IoC功能上的扩展服务,此外还提供许多企业级服务的支持,
如邮件服务、任务调度、JNDI定位、EJB集成、远程访问、缓存以及各种视图层框架的封装等。

spring-expression-3.2.2.RELEASE.jar
Spring表达式语言

com.springsource.org.apache.commons.logging-1.1.1.jar
第三方的主要用于处理日志

装配bean 的三种方式

<!-- spring内部创建对象的原理:
       1:解析xml文件,获取类名,id,属性
       2:通过反射,用类创建对象
       3:给创建的对象赋值
    -->
    <!--装配bean的三种方式-->
    <!--第一种方式:new实现类-->
    <bean id="userService" class="com.yejj.service.IUserServiceImpl"></bean>
    <!--第二种方式:通过静态工厂方法,在加载容器创建userService时会自动调用factory-method-->
    <bean id="userService2" class="com.yejj.service.UserServiceFactory" factory-method="createUserservice"></bean>
    <!--第三种方式:通过实例工厂方法-->
    <bean id="factory3" class="com.yejj.service.UserServiceFactory2"></bean>
    <bean id="userService3"  factory-bean="factory3" factory-method="createUserservice"></bean>

从spring容器中获取service,spring加载容器有三种方式

 /** 第一种方式:ClassPathXmlApplicationContext
         * 使用类路径加载,从class文件中读取(常用方法)
         * 及时加载,调用 new ClassPathXmlApplicationContext就会创建对象,创建对象时默认调用无参构造函数
         *    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");

        **/
        /**
         * 第二种方式:文件系统路径加载
         *  ApplicationContext applicationContext = new FileSystemXmlApplicationContext("F:\\ideaProject\\springStudy\\src\\beans.xmlbeans.xml");
         */
        /**
         * 第三种方式:使用beanfactory(已废弃方法)延时加载,使用getbean才会创建对象
         *  BeanFactory factory = new XmlBeanFactory(new FileSystemXmlApplicationContext(""))
         */
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
        IUserService iuser = (IUserService) applicationContext.getBean("userService");
        iuser.add();

bean的作用域

常用的两种:创建bean

singleton 在Spring IoC容器中仅存在一个Bean实例,Bean以单例方式存在,默认值
prototype 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时 ,相当于执行new XxxBean()
使用singleton还是不使用呢
  Beans被定义为两种部署模式中的一种:singleton或non-singleton。(后一种也别叫作prototype,尽管这个名词用的不精确因为它并不是非常适合)。如果一个bean是singleton的,那么仅有一个共享的这个bean的实例被管理,所有id或者ids与这个bean定义匹配的beans请求都会导致那个唯一特定的bean实例被返回。
  而non-singleton,prototype模式的bean部署产生的后果是:对这个bean的每次请求都会创建一个新的bean实例。这对于例如每个user需要一个独立的user对象这样的情况是非常理想的。
  Beans默认被部署为singleton模式,除非你指定为另外的。要紧记把类型变为non-singletion(prototype)后,每一次对这个bean的请求都会导致一个新创建的bean而且这可能并不是你真正想要的。所以仅仅在绝对需要的时候才把模式改成prototype的。
  在下面这个例子中,两个bean一个被定义为singleton的而另一个被定义为non-singleton(prototype)的。exampleBean会在客户端每次向BeanFactory请求它的时候被创建,而yetAnotherExample仅仅被创建一次;在对它每次请求的时候这个实例的引用会被返回。
  
  
  
  注意:当部署一个bean为prototype模式时,这个bean的生命周期就会有稍许改变。通过定义,Spring无法再管理一个non-singleton/prototype bean的整个生命周期,因为当它创建之后,它被交给客户端而且容器根本不再留意它了。当说起non-singleton/prototype bean的时候,你可以把Spring的角色想象成“new”操作符的替代品。从那之后的任何生命周期方面的事情都由客户端来处理。

bean的生命周期

在这里插入图片描述
生命周期图解释
1.instantiate bean对象实例化
2.populate properties 封装属性
3.如果Bean实现BeanNameAware接口 执行 setBeanName为bean设置name
4.如果Bean实现BeanFactoryAware 执行setBeanFactory ,获取Spring容器把对 象放进容器/工厂。
5.如果存在类实现 BeanPostProcessor(后处理Bean) ,执行postProcessBeforeInitialization
6.如果Bean实现InitializingBean 执行 afterPropertiesSet,属性赋值完成之后执行此方法
7.调用 调用用户自定义初始化方法 init
8.如果存在类实现 BeanPostProcessor(处理Bean) ,执行postProcessAfterInitialization
-------执行业务处理-----------
9.如果Bean实现 DisposableBean 执行 destroy
101.调用 指定销毁方法 customerDestroy

在这里插入图片描述Bean的完整生命周期所用到的组件大概可以分为以下几类:
1、Bean级别的接口
Bean自身定义的方法或者实现了接口的方法,即init-method和destroy-method指定的方法,还有实现了BeanNameAware,BeanFactoryAware,InitializingBean,DiposableBean等接口的方法。

2、容器全局后处理器接口
包括了BeanFactoryPostProcessor,InstantiationAwareBeanPostProcessor,BeanPostProcessor这两个接口,它们是容器全局级别的接口。

参数注入

构造方法注入

 <!--构造方法注入属性值-->
   <!-- <bean id="stu" class="action.student" scope="singleton">
        &lt;!&ndash;相当于调用 public student(String name, String pass)构造方法&ndash;&gt;
        <constructor-arg name="name" value="yejj"></constructor-arg>
        <constructor-arg name="pass" value="password"></constructor-arg>

    </bean>-->
    <bean id="stu" class="action.student" scope="singleton">
        <!--通过索引+type的方式注入 public student(String name, String pass)index指构造方法参数中的位置 -->
        <constructor-arg index="0" value="yejj" type="java.lang.String"></constructor-arg>
        <constructor-arg index="1" value="password" type="java.lang.String"></constructor-arg>

    </bean>

属性setter方法注入(常用方式)

 <bean id="userService" class="com.yejj.service.IUserServiceImpl" scope="singleton">
        <!--依赖注入,调用对象的set方法将属性注入对象,动态将依赖对象注入bean中-->
        <property name="name" value="zhangsan"></property>
    </bean>

通过P命名空间注入

在这里插入图片描述

SPEL表达式

Spring 表达式
 对进行统一编程,所有的内容都使用value

#{123}、#{‘jack’} : 数字、字符串
#{beanId} :另一个bean引用
#{beanId.propName} :操作数据
#{beanId.toString()} :执行方法
#{T(类).字段|方法} :静态方法或字段

集合注入

集合的注入都是给添加子标签

		数组:<array>
		List:<list>
		Set:<set>
		Map:<map> ,map存放k/v 键值对,使用<entry>描述
		Properties:<props>  <prop key=""></prop> 
		
普通数据:<value>
引用数据:<ref>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值