miwaiwai

导航

spring开发步骤

准备:

  1.https://repo.spring.io/ui/

  2.artifactory--->artfacts--->plugins-release--->org----->springframework--->spring选择需要的版本下载即可

  或者直接进入这个网址https://repo.spring.io/ui/native/plugins-release/org/springframework/spring/

1.spring项目至少需要5jar

  spring-aop.jar     开发aop特性需要的jar

  spring-beans.jar       处理bean的jar

  spring-context.jar     处理spring上下文的jar

  spring-core.jar         spring核心jar

  spring-expression.jar   spring表达式

  三方提供的r日志.jar

  commons-logging.jar   日志

2.编写配置文件

  为编写时有一些提示,自动生成一些配置信息,可以给eclipse增加,支持spring的插件:spring tool suite,

  安装步骤:

  1.先去market搜索 spring tool suite

  2.安装图片中的2个插件

  

 

3.新建bean configuration--->applicationContext.xml

4.开发spring程序(IOC)

5.创建学生类Student

6.在applicationContext.xml配置对象

7.在测试类中通过调用new ClassPathXmlApplicationContext("applicationContext.xml")获取该对象

        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Student student = (Student) context.getBean("student");
        System.out.println(student);

 可以发现spriing帮忙我new了对象,并且帮我们给对象赋值

8.IOC(控制反转)也可以称为DI(依赖注入)

 控制反转:将创建对象,属性值的方式进行了犯罪,从new,setXxx(翻转为从springIOC容器getBean()

 依赖注入:将属性值注入给了属性,将属性注入给了bean,将bean注入给了ioc容器

总结:ioc/di,无论需要什么对象,都可以直接去springioc容器中获取,而不需要自己操作(new\setXxxx())

  因此之后的ioc分为二步:

      1.先给springioc中存放对象并赋值

      2.拿对象

 IOC容器赋值:如果是简单类型(8个基本+String),value;如果是对象类型,ref="需要引用的id值",因此实现了对象与对象之间的依赖注入

set方法依赖注入:

  赋值:默认使用的是set方法();

依赖注入的底层是通过反射来实现的

依赖注入3种方式

  1.set注入

    赋值,默认使用的是set方法()

    依赖注入底层是通过放射实现的

    下面的例子是通set方式注入的:

        <property>关键字

  2构造器注入:通过构造方法实现注入

  <constructor>

    

   注意:如果<constructor-arg>的顺序与构造器方法参数不一致,需要通过type或者index或者name来指定

 3.p命名空间

简答类型:

p:属性名="属性值"

 引用类型(除了String外)

P:属性名-ref="引用的id"

注意:

  1.多个p赋值之间,要留空格

  2.无论是String还是Int/short/long,在赋值时都是value="值",因此建议此种情况,需要配合其他name\type进行区分

示例:注入各种输数据类型list,set,map,properties

  set,list,数组,各自有自己的标签<set> <list> <array>,但是也可以混着用

  给对象类型赋值null:

      <property name=""name">

          <null/>

      </property>

赋空值:

    <property name="name">

          <value></value>

    </property>

在ioc中定义bean的前提:该bean的类必须提供了无参构造

自动装配:(只使用与ref类型)

  约定优于配置

  <bean .... class="类路径" autowire="byName">

  bean的id值=类的属性名

byName:自动寻找,其它bean的id值=该Course类的属性名

byType:其它bean的类型(class)是否与该Course类的ref属性类型一直(注意:此种方式必须满足:当前ioc容器只能有一个bean满足)

constructor:其它bean的类型(class)是否与该Course类的构造方法参数的类型一致,此种方式的本质就是byType

可以在头文件中,一次性将ioc容器的所有bean,设置为自动装配

  自动装配虽然可以减少代码量,但是会降低程序的可读性,使用时需要谨慎

<?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:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"

default-autowire="byName"
>

 

 

使用注解定义bean;通过注解的方式,将bean以及相应的属性值放入ioc容器

  1.在applicationConfiguration.xml配置扫描器,先要加上头

    1>

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xs

    2>配置扫描器

    

<?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:p="http://www.springframework.org/schema/p"
    
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"
        
        
    default-autowire="byName"
        >
        <!-- 配置扫描器 -->
        <context:component-scan base-package="类路径1,类路径2,类路径3,"></context:component-scan>在启动的时候,会根据base-package该包中所有类

 

 

     3.在需要扫描的类上面加上@Component("bean的id")注解

     Component细化:

        DAO层注解:@Repository

        service层注解:@Service

        controller层注解:@Controller

使用注解实现事务(生命式事务)

目标:通过事务使以下方法要么全成功,要么全失败

public void addStudent(){

    //增加班级

    //增加学生

    //crud

}

    a>jar

       spring-tx-4.3.9.RELEASE

     ojdbc.jar

     commons-dbcp.jar连接池使用到的数据源

     commons-pool.jar 连接池

     spring-jdbc-4.3.0.RC2.jar数据库驱动

     aopalliance.jar

    b>在applicationConfiguration.xml配置数据库相关

jdbc\mybatis\spring

增加事务tx的命名空间

<!--增加对事务的支持-->

<tx:annotation-driven Transaction-manager="txManager">

c.使用

  将需要称为的事务的方法前增加注解

@Transactional(readOnly=false,propagation=Propagation.REQUIRED)

 aop编程:

  一个普通类------->有特定功能的类

  a,继承类

  b.实现接口

  c.加个注解

  d.配置

把类变成----通知

  实现接口

前置通知实现步骤:

   1>jar

    aopliance.jar

    aspectjweaver.jar

   2>配置  

     将业务类,通知纳入springIOC容器

     定义切入点(一端),定义通知类(另一端),通过pointcut-ref将两端连接起来

   3>编写代码

    aop:每当之前add()之前,自动执行一个方法log()

    add():业务方法

    log():自动执行的通知,即aop前置通知

  如果出现异常:类似java.lang.NoClassDefoundError,就是缺少jar包或者jar包错了

异常通知:

  根据异常通知接口的定义可以发现,异常通知的实现类必须编写一下方法:

  public void afterThrowing([Method,args,target,ThrowableSubclass])

   a>public void afterThrowing(Method,args,target,ThrowablesSubclass)

   b>public void afterThrowing(ThrowableSubclass)

环绕通知:在目标方法的前后,异常发生时,最终等各个地方都可以进行的通知.他是最强大的一个通知.9可以获取目标方法的全部控制权(目标方法是否执行,执行之前,执行之后,参数,返回值等)

  在使用环绕通知时,目标方法的一切信息都可以通过invocation拿到

二:实现注解实现通知:

  1>jar

    与实现接口方式需要的包是一样的

  2>配置

    1>将业务类,通知纳入springIOC容器

    2>开启注解

      在applicationContext.xml

      <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

     3>编写

    定义切入点(一端),定义通知类(另一端),通过pointcut-ref将两端连接起来

   通知类的实现:

    @Aspect //声明该类是通知类
    public class LogBeforeAnnotation{

      @Before("切入点类路径.方法名")//声明这个方法是一个前置通知方法,里面的属性定义切点
      public void myBefore(){
        System.out.println("注解形式-前置通知")
        }
      
      @AfterReturning("企鹅额议案类路径.方法名")
      public void myAfter(){
    
        System.out.println("注解形式-前置通知")

        }
}

 

     3>将通知类纳入springIOC容器

      在类前面加上@Component()

    @Component("Bean的id")//将LogBeforeAnnotation类纳入springIOC容器

    @Aspect //声明该类是通知类     public class LogBeforeAnnotation{       @Before("切入点类路径.方法名")//声明这个方法是一个前置通知方法,里面的属性定义切点       public void myBefore(){         System.out.println("注解形式-前置通知")         }              @AfterReturning("企鹅额议案类路径.方法名")       public void myAfter(){              System.out.println("注解形式-前置通知")         } }

  

注意:通过注解形式将对象增加到IOCrongqi 需要增加扫描器和开启注解

  

  
    增加扫描器,开启注解,但是开启注解需要扫描器
<context:component-scan base-package="org.lanqiao.aop"></context:component-scan>
  扫描器会将制定的包中的@Component @Service@Respository @Controller 修饰的类产生的对象,增加到IOC容器中

  //开启注解对aop的支持  <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
@Aspect不需要加入扫描器,只需要开启即可

 

 通过注解形式实现的aop,如果想获取目标对象的一些参数,则需要使用一个对象,这个对象是固定JoinPoint,是约定的

 

 

 

     @Around 环绕通知

 

     @AfterThrowing异常通知

     

 三.通过配置将一个类变为通知类,或者通过配置实现通知类

    通过applicationConfiguration.xml里面基于Schema配置,类似与实现接口的方式

    接口方式的通知类:public class LogAfter implements AfterReturningAdvice

    Schema方式通知:

      1>编写一个普通类,public class LogAfter{}

      2>将该类通过配资转为一个通知

 

    

    最终通知也可以单独实现:

    @After

    public void myAfter("切入点的类路径.方法"){

      }

  如果要获取目标对象的信息:

    注解和Schema: JoinPoint获取

    接口:Method method,Object[] args,Object target

    schema形式和注解形式相似,不同之处:注解形式使用了@after,schema形式进行了多余的配置

web项目如何初始化SpringIOC容器

    当服务启动时候(就是tomcat启动时候)将IOC重启初始化

          |
                                    |
          |
                                    |
            \|/
     监听器:监听tomcat是否启动,一旦启动,立刻实例化一个IOC容器对象

这个实例化过程,别人已经写好了,直接用就可以了

 

 

  

 

 在web项目里面可以加载多个配置文件,在web.xml中进行配置

      

 

 也可以通过通配符指定

 

 

 

 Spring整合MyBatis

  思路:

  SqlSessionFactory-->SqlSession-->StudentMapper--->crud

  可以发现,MyBatis最终试试通过SqlSessionFactory操作数据库

  spring整合MyBatis其实就是将MyBatis的SqlSessionFactory交给spring

  整合步骤:

  1.jar包

     mybatis-spring.jar专门用于2者的整合

    spring-tx.jar

    spring-jdbc.jar

    spring-expression.jar

    spring-context-support.jar

    spring-core.jar

    spring-context.jar

    spring-beans.jar

    spring-aop.jar

    spring-web.jar

    commons-logging.jaar

    commons-dbcp.jar

    ojdbc.jar

    mybatis.jar

    log4.jar

    commons-pool.jar

  2.类和表

  3.Mybatis配置文件

  4.通过mapper.xml将类表建立起映射关系

  5.

  之前:conf.xml--->SqlSessionFactory

  现在整合的时候,需要通过Spring管理SqlSessionFactory,因此产生SqlSessionFactory所需要的数据库信息,不在放入conf.xml

而需要放入spring配置文件中applicationContext.xml进行数据源的配置

配置Spring配置文件(ApplicationContext.xml)

6.使用Spring-MyBatis整合产物

  目标:通过spring产生mybatis最终需要的动态mapper对象studentMapper对象

    spring产生动态mapper对象,有3种方法:

      1>DAO层实现类,集成SqlSessionDaoSupport类---->就会产生一个SqlSessionFactory对象

      2>就是省略掉第一种方式的实现类

        直接使用Mybatis提供Mapper实现类:org.mybatis.spring.mapper.MapperFactoryBean

        缺点:每个mapper都需要配置一次

      3>第三种方式

        批量配置实现类(批量产生多个mapper)

        批量产生Mapper对在SpringIOC中的id值默认就是接口名

Spring Ioc容器:

  xml配置文件:applicationContext.xml

    存bean: <bean id class>

    取bean:

获取IOC容器:  ApplicationContext context=new ClassPathXMLApplicationContext("applicationContext.xml")

获取bean              context.getBean("bean的id")

 

  注解:@Configuration,配置类就是ioc容器

 

注意:xml配置文件和配置类2种形式的ioc是独立的,就是有2个ioc容器,各自是各自的,要一个ioc是对的,如果是2个就是有问题的

  ioc容器功能:

    bean就是数据的载体

    1>存数据bean

      @Bean+方法的返回值

    2>取数据bean

 获取IOC容器: ApplicationContext context=new AnnotationConfigApplicationContext(MyConfig.class)

获取bean         context.getBean("bean的id")

  注解形式给IOC容器中存放Bean:

    1.必须有@Configuration注解(配置类)

    2.形式:

        三层组件加入IOC容器:需要给各类加注解,扫描器识别注解所在包(@Controller,@Service,@Repository(DAO)):

          步骤:

             1>给三层组件分别加注解(@Controller,@Service,@Repository---->@component)

             2>将注解所在的包纳入ioc扫描器ComponentScan()

                纳入扫描器有2种方法:

                        a>xml配置文件:

                        <context:Component-scan base-package="包的路径"> </context:componet-scan>

                        逻辑:在三层类上加注解,让ioc能够识别,扫描器

                        b>注解方式:  

  可以给扫描器指定规则:

      过滤类型:FilterType(ANNOTATION,ASSIGNABLE_TYPE,CUSTOM)

      ANNOTATION:三层注解类型@Controller,@Service,@Repository->@Component

  

                  

 

      @Bean+方法返回值

 

      

 

 

 

 

 

 

posted on 2024-01-14 12:37  米歪歪  阅读(3)  评论(0编辑  收藏  举报