Spring框架

什么是Spring

  • [1] Spring是一个一站式轻量级的开源框架,具有IOCAOP两大核心功能,而且可以出色的整合各种第三方框架或者类库。
  • [2] 一站式:从dao,service,web三层结构出发,每一层都可以做。
  • [3] 轻量级:轻量级是一种设计思想,是用什么功能就开启对应支持的一种思想。
  • [4]Spring还能整合开源世界众多的第三方框架和类库,逐渐成为使用最多的Java EE企业应用开源框架

Spring的IOC概念

IOC翻译过来叫控制反转【或者叫反转控制】。之前当我们需要一个对象,是自己主动去创建。现在spring规定我们对象不要自己创建了,把对象的创建权反转给了spring的IOC工厂【类似于我们写的MyBeanFactory】,spring的IOC工厂会把spring配置文件中所有单例对象都创建出来并放入到IOC容器【类似于我们写的iocMap】中,我们需要对象直接从IOC容器中去获取即可。

Spring的IOC入门案例

在这里插入图片描述
提供接口跟实现类

   //接口
   package com.itheima.dao;

public interface UserDao {
    public void saveUser();
}
  //实现类
  package com.itheima.dao.impl;

import com.itheima.dao.UserDao;

public class UserDaoImpl implements UserDao {
    public void saveUser() {
        System.out.println("添加成功");
    }
}
  <--配置文件 -->
  <-- bean标签中的id属性给定的是想要执行的实现类名(随便起) ,class属性写入是想要执行的实现类全类名 -->
  <?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:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop"

        xsi:schemaLocation="http://www.springframework.org/schema/beans
			    http://www.springframework.org/schema/beans/spring-beans.xsd
			    http://www.springframework.org/schema/context
			    http://www.springframework.org/schema/context/spring-context.xsd
			    http://www.springframework.org/schema/aop
			    http://www.springframework.org/schema/aop/spring-aop.xsd">
    <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
</beans>
  //测试类
  import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class UserTest {
   @Test
    public void saveUser(){
       //获取IOC容器
       ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
       //使用IOC容器生产出来的对象调用方法,获取想要得到的实体类对象
       UserDao userDao = (UserDao) ac.getBean("userDao");
       userDao.saveUser();
   }
}

测试结果
在这里插入图片描述

Spring中常用API说明

在这里插入图片描述

Spring的bean对象作用域

单例:默认就是单例
多例:需要设置scope属性

 <bean id="userDao1" factory-bean="userFactory" factory-method="createFactory" scope="prototype"/>

scope属性有五个取值:

  • [1] singleton(默认) 创建出的实例为单例模式, IOC只创建一次,然后一直存在
  • [2] prototype 创建出的实例为多例模式, 每次获取bean的时候,IOC都给我们重新创建新对象
  • [3] request(web) web项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中.
  • [4] session (web) web项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中.
  • [5] globalSession (用于分布式web开发) 创建的实例绑定全局session对象

单例对象跟多例对象的生命周期

单例对象生命周期
出生
容器初始化完成后出生
活着
容器在,对象在
死亡
容器销毁,对象死亡。

多例对象生命周期
出生
使用对象的时候才创建
活着
一直活着
死亡
由java垃圾回收器负责回收

依赖注入的概念

DI翻译过来就是依赖注入。A对象中有个B对象的私有属性,就可以说A依赖于B。
注入,就是给属性赋值。
Spring中的DI分Setter方法注入值和构造方法注入值。
Spring中要个一个对象的属性注入值,前提条件是当前对象必须在IOC容器中。如果被注入的属性是一个对象类型,当前对象也必须在IOC容器中。
DI是依赖于IOC的。

注解版IOC流程

创建工程并导入jar包
在这里插入图片描述提供spring配置文件

  //配置文件
    <!-- component-scan组件扫描 -->
    <!-- 组件扫描是指定一个包,让spring加载IOC容器的时候
         会自动扫描当前的包,及其子包下的所有类
         发现类上面有IOC的注解,就会自动根据规则把当前类的实例放入到IOC容器中
         如果发现类中的属性上有DI注解,也会根据规则给当前属性注入值
     -->

    <context:component-scan base-package="com.itheima.dao"/>
</beans>
  //接口
  public interface UserDao {
    public void saveUser();
}

//实现类
/*
 *   component注解相当于原先写在xml配置文件中的bean标签(id=别名,class=实现类的全限定名)
 *   在component注解中id默认为当前绑定的类名的首字母小写(userDao)
 */

@Component
public class UserDaoImpl implements UserDao {

    @Override
    public void saveUser() {
        System.out.println("添加成功");
    }
}
  //测试方法
   @Test
    public void saveUser() {
        //获取IOC容器对象
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        //根据绑定的id获取指定名称的实现类对象
        UserDao userDao = (UserDao) ac.getBean("userDaoImpl");
        //调用实现类中的方法执行业务
        userDao.saveUser();
    }

Spring中IOC注解说明

Spring一共提供了四个使用构造方法创建对象的IOC注解

@Component
这个是通用的IOC注解,一般用于工具类的创建
由此注解延伸出三个个性的注解

@Controller 只适用于Controller层对象的创建
@Service 只适用于service层对象的创建
@Repository 只适用于dao层对象的创建

改变对象作用域的注解

单例
默认就是单例
多例
在这里插入图片描述

测试生命周期的注解

在这里插入图片描述
注意:这两个注解是java提供的
说明:spring并没有提供简单类型属性和集合属性注入的DI注解

把之前纯xml案例的配置文件分成dao模块和service模块

在这里插入图片描述

       <!-- 将dao层的配置文件引入到service配置文件 -->
    <!-- import标签只可以引入spring的配置文件 -->
    <import resource="applicationContext-dao.xml"/>

    <!-- 将service层实现类对象交给IOC容器 -->
    <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
        <property name="accountDao" ref="accountDao"/>
    </bean>
</beans>
       <!-- 使用context标签引入配置文件 -->
    <context:property-placeholder location="classpath:db.properties"/>

    <!-- 将数据库连接池对象导入IOC容器 -->
    <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${db.driver}"/>
        <property name="jdbcUrl" value="${db.url}"/>
        <property name="user" value="${db.user}"/>
        <property name="password" value="${db.password}"/>
    </bean>

普通对象类型的注入DI之@Autowired

**@Autowired放在属性上:**此注解放在属性上默认会先根据当前属性的类型【by type】去IOC容器中寻找同类型的对象给当前属性注入值。
如果找到唯一一个同类型对象,就直接注入成功了。
如果找到了多个同类型对象,则会继续在这些同类型对象中根据属性名【by name】去匹配对象id。
如果找到0个同类型对象,当只当了required=false属性的时候,会把当前属性对象赋值为null,否则会报错。
如果指定了@Qualifier(“userDaoImpl1”)注解,就只会根据当前属性名去匹配指定的对象id了。

@Autowired放在方法上:此注解放在方法上,表示当前方法由spring自动执行。
如果当前方法有参数,spring会自动从IOC容器中寻找同类型的对象给其传参。如果找到多个同类型,则会继续根据参数名去匹配对象id。如果参数上指定了@Qualifier(“userDao”)注解,则会根据注解中的名称去IOC容器中找到同id名称的对象给其传参。

普通对象类型的注入DI之@Resource使用

此注解只能放在属性上,默认情况下会先根据当前属性名去匹配IOC容器中的对象id【by name】,如果没有找到同名对象,则会继续根据当前属性类型去匹配【by type】。如果指定了name属性,则只会根据name属性中指定的名称去IOC容器中匹配对象id【by name】。
注意:此注解是java提供的,用的不多。

Spring中的AOP

AOP是面向切面编程,AOP是一种编程思想,spring的AOP底层使用jdk和cglib两种动态代理.优先使用jdk,配合使用cglib,在目标对象没有实现接口的时候才用cglib.

目标对象
被代理对象

通知【增强类】
需要在目标对象中添加的代码

代理对象
增强后的目标对象就是代理对象

链接点
目标对象中所有的方法都是链接点。

切入点
目标对象中被增强的方法叫切入点。

织入
这是一个动词,把通知类中的方法增强到切入点方法的过程。

切面
切面就是切入点与通知的组合,也就是织入后的产物。

Spring中AOP通知的类型说明

四大通知
前置通知:一定在切入点方法之前执行
后置通知:一定在切入点方法成功后执行
异常通知:一定在切入点方法异常时执行
最终通知:一定在方法执行完毕后执行
说明:实际开发中,使用aop,不一定要把这四大通知用全,需要什么用什么。

环绕通知
环绕通知是四大通知的综合,而且比四大通知合起来还强大
因为环绕通知可以切入到切入点方法内部的参数中。修改参数。

在配置文件中配置AOP

    //配置文件
    <!--配置切面-->
<aop:config>
    <!--指定切入点表达式-->
    <aop:pointcut id="pointcut" expression="execution(public void com.itheima.service.impl.UserServiceImpl.saveUser())"/>
    <!--
    织入操作:其实就是指定通知方法在切入点方法上执行的位置
    <aop:aspect  织入操作配置标签
    id="aspect"  当前切面的id
    ref="myAdvice">   指定当前织入使用的通知类
    -->
    <aop:aspect id="aspect" ref="myAdvice">
        <!--
        <aop:before  指定在切入点方法执行的位置
        method="before"  指定实现的通知方法
        pointcut-ref="pointcut"/>  指定切入点方法
        -->
        <aop:before method="before" pointcut-ref="pointcut"/>
        <aop:after-returning method="afterReturning" pointcut-ref="pointcut"/>
        <aop:after-throwing method="afterThrowing" pointcut-ref="pointcut"/>
        <aop:after method="after" pointcut-ref="pointcut"/>
    </aop:aspect>
</aop:config>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值