美文网首页程序员
Spring学习笔记

Spring学习笔记

作者: 渔樵店 | 来源:发表于2017-08-08 09:24 被阅读0次

    IOC(Inversion of Control)控制反转 DI(Dependency Injection)依赖注入

    反转资源的获取方向,由spring容器创建对象

    配置bean的方式

    在xml文件中通过bean结点来配置bean
    <bean id="hellowWorld" class="com.pxc.hellow">

    </bean>
    如果没有指定唯一的id会自动以完整类名作为默认值

    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    public class Main {
        public static void main(String[] args) {
            //获取容器对象
             ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
             //通过容器对象来获取配置的 javabean
             Person person=(Person)ioc.getBean("person1");
             System.out.println(person);
        }
    }
    

    ApplicationContext类的主要实现类

    ClassPathXmlApplicationContext:从类路径下加载配置文件
    FileSystemXmlApplicationContext:从文件系统中加载配置文件
    WebApplicationContext:专门为WEB应用而准备的,它允许从相对于web根路径中完成初始化工作

    获取bean的三种方式

    1. getBean(String id)(要强转)
    2. getBean(Class)
    3. getBean(String id,Class)

    给构造器传递参数

    <bean id="dog3" class="com.pxc.Dog>
    <constructor-arg value="哈士奇 "></constructor-arg>
    </bean>

    注入属性的细节

    如果注入的值具有特殊的字符要用<![CDATA[]]>但是这种方式只能通过value标签注入

    引用其他bean

    <property name="car" ref="car1"></property> //引用另外一个bean
    可以配置级联属性
    <bean id="car1" class="com.pxc.Car></bean>
    <bean id="persoon1> class="con.pxc.Person>
    <property name="name" value="pxc"></property>
    <property name="age" value="20"></property>
    <property name="car" ref="car1"></property>
    <property name="car.price" value="300000"></property>
    </bean>

    集合属性

    通过<list></list>标签来注入
    <map>
    <entry key="car1" value-ref="car1"></entry>
    </map>

    spring2.5后依赖注入可以使用p命名空间来简化操作

    <bean id="person1" class="com.pxc.Person" p:name="pxc" p:age="20" p:car-ref="cars"></bean>

    自动装配(用的比价少)

    byType:按照类型自动装配,这种方式不好的地方是如果在IOC容器中存在两个相同属性的bean会报错
    byName:按照bean的id名确保唯一
    <bean id="person1" class="com.pxc.Person" p:name="pxc" p:age="20" autowire="byType"></bean>

    bean之间的关系

    Paste_Image.png Paste_Image.png

    Bean的作用域

    Paste_Image.png

    Spring EL表达式 用的是#

    • 引用其他的bean
      <bean id="person1" class="com.pxc.Person">
      <properties name="car" value="#{car}"></properties>
      </bean>

    • 调用方法以及引用对象中的属性
      <bean id="person1" class="com.pxc.Person">
      <properties name="name" value="pxc"></properties>
      <properties name="car" value="#{car}"></properties>
      </bean>
      <bean id="person2" class="com.pxc.Person">
      <properties name="car" value="#{person1.name.toUpperCase()}"></properties>
      <properties name="car" value="#{person1.car}"></properties>
      </bean>

    • 进行运算
      <bean id="person1" class="com.pxc.Person">
      <properties name="age" value="10"></properties>
      </bean>
      <bean id="person2" class="com.pxc.Person">
      <properties name="age" value="#{person1.age+10}">
      </bean>

    • 支持正则和三目运算符

    bean的生命周期

    Paste_Image.png

    <bean id="person" class="com.pxc.Person" init-method="a" destroy-method="b">
    <properties name="age" value="20"></properties>
    </bean>

    bean的后置处理器

    Paste_Image.png Paste_Image.png

    如果bean没有初始化方法也会执行后置处理器

    Bean的配置方式

    1. 通过全类名:也就是反射

    2. 通过工厂方法:
      静态工厂方法:

    Paste_Image.png

    包含静态工厂方法类
    <bean id="dateFormat" class="java.text.DateFormat" factory-method="getDateInstance">
    <constructor-arg value="2"></constructor-arg>
    </bean>
    实例工厂方法:

    Paste_Image.png

    <bean id="simpleDateFormat" class="java.text.SimpleDateFormat">
    <constructor-arg value="yyyy-MM-dd HH:mm:ss"></constructor-arg>
    </bean>
    <bean id="date" factory-bean="simpleDateFormat" factory-method="parse">
    <constructor-arg value="2017-8-8 12:12:12"></constructor-arg>
    </bean>

    1. FactoryBean:
    Paste_Image.png

    配置一下:
    <bean id="person2" class="com.pxc.PersonFactoryBean"></bean>

    基于注解方式配置bean

    • @Component(value="pxc1")
      无需指定创建的bean的id值,有默认的命名策略,将类名首字母小写作为默认的id值,如果设置value属性值就是用户指定的id
      然后需要在配置文件中告知spring要扫描哪个包,首先得导入context的命名空间,然后做一下配置
      <context:component-scan base-package="com.pxc"></context:component-scan>

    • @Respository 标识持久层bean组件

    • @Serivice标识业务层

    • @Controller标识控制层

    都可以用@Autowired来完成自动装配@Autowired是按照类型进行装配
    @Resource是按照名字装配,@Inject和@Autowired一样只不过没有require属性

    AOP(切面编程)

    • 如果没有aop,将核心业务和普通业务分离使用代理模式

    第一步:

    Paste_Image.png

    第二步:

    Paste_Image.png

    第三步:

    Paste_Image.png

    主方法调用:

    ![Uploading Paste_Image_235358.png . . .]

    AOP的作用简单来说就是在执行方法前,中后干一些事情,比如数据库事务的提交,数据的关闭,只要在项目开发前配置完成,程序员便不用再考虑这些,切面编程有两种方式。

    AOP的术语:

    Paste_Image.png
    1. 切面(Aspect):横切关注点模块化(抽象),具有相同功能的横切关注点可以抽象成一个切面。(前置日志后后置日志抽象成一个切面)
    2. 横切关注点。业务处理当中,不同业务的分离点
    3. 通知(Advice):切面必须要完成的工作
    4. 目标(Target):被通知的对象(被代理的对象)
    5. 连接点(JoinPoint)Spring允许加入通知的方法,是横切关注点的另一种表现形式
    6. 切点(pointcut):AOP通过切点定为到特定的连接点
    • 基于AspectJ注解
    image.png
    1. 写一个切面类,@Aspect标注
    2. 共同业务加入到切面。业务共同的方法
      3.前置通知,后置通知@Before("execption(public int 完整的方法名)")
      后置通知无论执行是否有异常都会执行。
    3. 需要在spring配置文件中开启aop配置
      <aop:aspectj-autoproxy/>
    4. 要加很多@Component注解

    切点表达式

    *:通配符,所有
    ..:在方法的参数列表中使用,不限定类型,顺序,个数

    Paste_Image.png

    在通知方法的内部访问连接点的细节

    在通知方法的参数中,加入一个JoinPoint类型的参数
    JoinPoint的一些方法:

    获取参数列表:jp.getArgs();
    获取方法的名称:jp.getSignature().getName();

    返回通知

    @After注解无论方法返回过程中是否抛出异常都会执行,@AfterReturing必须是返回成功才会执行,加了这个注解后添加一个returning属性可以得到返回值

    Paste_Image.png

    异常通知 @AfterThrowing

    Paste_Image.png

    环绕通知(用的少)

    Paste_Image.png Paste_Image.png

    切面的优先级

    Paste_Image.png

    重用切入点

    Paste_Image.png
    • 基于XML配置
    image.png

    spring对JDBC的支持

    Paste_Image.png

    相关文章

      网友评论

        本文标题:Spring学习笔记

        本文链接:https://www.haomeiwen.com/subject/xsfkqxtx.html