zoukankan      html  css  js  c++  java
  • Spring5最新完整教程IDEA版【通俗易懂2019.11月】

    1.Maven找包:

    spring-webmvc

    spring-jdbc

    2.Spring的本质是控制反转,依靠依赖注入来实现。以一个servcie对象为例,即是service暴露注入接口(构造,set方法),由spring配置对象注入(设置)给该service对象,这样可以做到Service层专注业务,不需要因为变化改变自身代码,只要在调用(注入)的时候改变对象即可改变service的具体实现,service面向接口编程,由service主动构建对象到被动接收外部注入的对象。同时Spring作为容器会自己构建对象,这些对象可以作为参数来注入

    对象由Spring来创建,管理,装配

    3.resources目录放beans.xml

    <bean id=  class= >

        <property name= value=>

    bean相当于一个对象,property相当于给对象属性设值,id是对象的唯一标志符,class为类型,name为别名用逗号或者空格,分号分开;scope指定是不是单例

    程序里通过ClassPathXmlApplicationContext("beans.xml")获取ApplicationContext

    getBean(id)获取bean,类型转换之后即可用。也可以通过.class获取xml里的对象,不用强制类型转换了

    4.property标签中,ref指的是spring容器中创建好的对象,value指的是基本数据类型的值

    5.现在,要用不同的底层实现,只要设置代码动态读入相应的配置文件即可,代码不用改了

    6.默认使用无参构造对象。

       要使用有参构造,需要在bean标签下用<constructor-arg>标签,index或者type来制定参数,或者多个constructor-arg标签直接使用name,value,ref赋值

    7. 容器只要被创建了,里边的对象就都会被创建了

    8.alias标签,通过name设置源id名,alias设置别名

    9.import标签,将多个配置文件合并导入为一个,resource属性指定文件名

    10.可以看到,spring的标签还是比较少的。下面要学习标签里的属性

    11.依赖注入

    构造器注入

      construct-arg标签

    set方式注入

      bean,ref,idref,list,set,map,props(Properties类),value,null可以用来设置属性的值

      要注入,必须有set方法。非boolean类型的变量,set方法名要是set+属性名

    • 普通值注入,value注入:<property name="a" value="avavlue">
    • bean对象注入,通过ref指向id,ref=“id”
    • 数组注入,property标签下要有<array><value>aaa </value><value>bbb</value></array>,value标签里的值可以没有双引号
    • list注入,<list>标签
    • map注入,<map> <entry key value/></map>
    • set注入,<set> <value></value></set>
    • null注入,property标签下直接加<null/>标签
    • properties注入,<props><prop key=“”>数值</prop></props>,比如数据库配置
    • idref注入,就是注入目标bean的id这个属性

    拓展方式注入

      p: c:这样的方式

          p和c是命名空间名称,使用需要导入约束

          p的意思是property,可以直接注入属性的值,即为<bean p:属性名=value>的形式,p:属性名-ref可以引用其他bean的id

      c是construct的意思,构造器注入,赋值方式和p的一致

          引入了xsd之后,这些都会有提示

    12.bean的作用域,即bean要构建几个,scope属性指定

    singleton:只有一个,默认值(单线程使用)

    prototype:get一次有一个(多线程使用)

    request:每次request有一个

    session:每次session有一个

     13.自动装配是spring自动在上下文中给对象注入属性

    自动装配要做两件事情,一是组件扫描,二是按照规则装配

      三种装配方式:

        xml里配置

        java代码注解配置

        隐式装配

     自动装配又叫autowire,可以设置bean标签里的autowire属性,可以有以下字符串的值

    • byname自动装配:自动在上下文里找和自己属性对应set方法后边的名字(首字母改成小写)一样的bean id。id要唯一
    • bytype自动装配:自动在上下文里找和自己属性类型相同的bean,类型要唯一,不然报错。要被注入的bean没有id也可以。class要唯一

    14.使用注解自动装配

    有三个自动装配的注解

    @Autowired和@Qualifier是Spring的注解

    @Resource是J2EE的注解

     这三个注解可以放在字段上,也可以放在set方法上,表示相应的对象属性要被spring自动装配。注解放在字段上,就不需要set方法了

     支持注解xml里要做两件事

    1.xml头部导入约束

    xmlns:context="http://www.springframework.org/schema/context"

    http://www.springframework.org/schema/context

    http://www.springframework.org/schema/context/spring-context.xsd

    2.使用<context:annotation-config/>标签

    @Autowired注解:表示默认按照类型扫描组件,装配到该属性。required属性表明是否支持该属性为null

    @Qualifier注解:指定该value为id的字符串,找这个id来装配。Qualifier注解不能独自存在

    @Resource注解:是Java自带的注解,是上边两个的结合体。先按照指定的name属性去查,再按照默认字段名去查,最后按照类型去查

    15.注解开发

    标签<context:component-scan base-package="com.kuang.pojo"/>指定要扫描的package,这个包下面的注解会生效
    @Component注解,指定bean,默认id为类名首字母小写,通过value值来改变
    @Value注解给对象的属性或者set方法注入

       衍生注解:

      Controller:@Controller

      Service:@Service

      Dao:@Repository

    这四个注解功能一样,都是为了把对象注册到spring容器里,只是为了方便区分

     @Scope注解:声明对象作用域

     注解的缺点,不是自己的类不能使用注解注册到spring容器中

     

     16.不用xml配置

    声明一个类,用@Configuration注解配置

    这个类里@Bean注解修饰的东西,返回值是bean标签的class属性,函数名称是其id属性

    获取注解配置,要用AnnotationConfigApplicationContext类:  ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfig.class);

    @ComponentScan注解指定扫描包

     @Import(com.a.class)注解:引入其他config类

    当使用 < context:component-scan/> 后,就可以将 < context:annotation-config/> 移除了,后者被自动忽略

     17.所有的类都要注册到注册到beans里边,所有的bean都要通过容器去取,容器里的bean取出来就是一个对象

    18.代理模式,将公共代码给代理,方便集中修改,分工明确,各做各的

    分为静态代理与动态代理,动态代理动态生成一个类,通过反射代理无数个类或者接口

    静态代理写死了类

    动态代理jdk原生方法,有两个类要关注

    1.InvocationHandler

    2.Proxy

    代理类继承InvocationHandler,实现其接口invoke在其中调用真正业务方法并在业务方法前后调用自己的公共代码。通过newProxyInstance动态生成被代理的接口对象,客户调用相应接口即可实现代理调用

    19.使用spring接口添加aop

    比如MethodBeforeAdvice ,MethodAfterAdvic,在其中的接口方法里做自己的操作

    xml里配置:

    1.导入约束

    2.在标签<aop:config>里配置。

      aop:pointcut定义切入点(业务方法),有id属性用于被环绕引用,experssion属性指定那个包哪个类哪个方法什么样的参数什么样的返回值

      aop:advisor定义环绕,属性advice-ref为实现了spring相应接口的bean id,pointcut-ref为要应用到的切入点业务方法引用

     20.使用自定义类添加aop

      aop:aspect定义切面,ref属性指向代理bean的id,即相应的代理方法实现类。里面可以有上面的切入点,还有aop:before等标签定义在什么时候切入。aop:before标签的method属性指定方法,pointcut-ref属性指定要切入的点

    这个功能简单,没办法获取切入点信息

    21.注解实现aop

    @Aspect注解定义切面,即代理实现类

    @Before定义before类方法,可以通过@Before("excecution(表达式)")这样的办法指定切入点

    22.总之,aop要定义切面,即代理方法,指定这些方法在哪些业务类什么位置执行

    23.<aop:aspectj-autoproxy>标签表面自动为用注解声明了的切面创建代理,织入切面

    proxy-target-class属性指定代理实现模式,jdk还是CGLib实现代理,true为CGLib

    24.@Around注解下,方法可以有个ProceedingJoinPoint参数,通过proceed方法执行方法,在这前后即可加入自己的操作

    25.aop在不影响我们的业务代码的情况下,实现动态的增强

    26. 整合Mybatis

    1.导入jar包

      mybatis

      mysql数据库连接需要的驱动包(mysql-connector-java)

      spring

      aop织入(aspectjewaver)

      mybatis-spring(整合包,取代mybatis默认的配置相关)  

      spring-jdbc(spring操作数据库需要的包)

    2.编写配置文件

      maven要在pom里设置静态资源过滤,把不在resources文件里,在java文件夹里的xml文件也导入项目进行编译

    编写mybatis步骤:

    1.pojo类

    2.配置文件

    3.Dao层Mapper接口

    4.Mapper.xml

    5.通过sqlSession的getMapper方法获取Mapper接口代理类然后执行里边的相应方法

    Mybatis里需要创造的对象,全部要由spring来创建,管理,装配

     Mybatis-Spring配置:

    在spring XML里要配置SqlSessionFactory和数据映射器(数据源,配置数据库的)

    数据源配置:

      可以使用Spring的数据源替换Mybatis的配置,也可以用c3p0,dbcp,druid(看class)

    <!--配置数据源:数据源有非常多,可以使用第三方的,也可使使用Spring的-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>

    SqlSessionFactory配置:

    类要用Mybatis-Spring包里的SqlSessionFactoryBean

    指定datasource,绑定mybatis包括config xml路径和各个mapper的xml路径

    <!--配置SqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!--关联Mybatis-->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="mapperLocations" value="classpath:com/kuang/dao/*.xml"/>
    </bean>

    Mybatis原生配置文件里的environments,datasource,transactionmanager配置会被Mybatis-Spring里的SqlSessionFactoryBean替代。

     同样的,Mybatis-Spring会用SqlSessionTemplate代替Myatis的SqlSession,由其自动管理SQL Session。这个类也是SqlSession的子类

    模板的意思是流程都是固定死的,只是流程里的数据是不确定的,要在调用的时候填入,在流程中使用

    所以,在xml里先用以下办法创建SqlSessionTemplate

    <!--注册sqlSessionTemplate , 关联sqlSessionFactory-->
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <!--利用构造器注入-->
        <constructor-arg index="0" ref="sqlSessionFactory"/>
    </bean>

    再把这个Bean注入到要访问Dao层的对象(新增接口实现类)里即可,用的时候调用SqlSessionTemplate的getMapper方法

    新的SqlSessionTemplate是线程安全的,在各个线程里都可以使用,不需要自己构造了。

    SqlSessionTemplate还支持Batch批量操作

     第二种整合办法:

    使用 SqlSessionDaoSupport

    继承这个类,设置其sqlSessionFactory或者sqlSessionTemplate之一即可。

    然后通过getSqlSession()获取SqlSessionTemplate

    SqlSessionTemplate操作Dao有两种办法,一是通过getMapper获取接口类调用其中方法,一是把包名+方法名传递给selectOne这样的常规操作函数来调用

     27.声明式事务

    事物把一组操作放一起,要不都成功,要不都失败,确保一致性和完整性

    ACID原则:

      原子性

      一致性

      隔离性

      持久性

    事务管理分编程式事物和声明式事务

    编程的要自己写代码调用Spring的API,比较麻烦

    声明的通过AOP配置,自动调用

    使用声明式事务步骤

    1.导入约束

    xmlns:tx="http://www.springframework.org/schema/tx"
    
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd">

    2.将jdbc事务管理器注入Spring并配置其数据源,类为Spring为事务管理抽象出来的类DataSourceTransactionManager

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource" />
     </bean>

    3.通过tx:advice标签配置管理器,即事物是什么,及其传播性

    其中tx:method配置事务管理器里抽象好的几个事物,add,delete之类的都是自己代码定义的

    <!--配置事务通知-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!--配置哪些方法使用什么样的事务,配置事务的传播特性-->
            <tx:method name="add" propagation="REQUIRED"/>
            <tx:method name="delete" propagation="REQUIRED"/>
            <tx:method name="update" propagation="REQUIRED"/>
            <tx:method name="search*" propagation="REQUIRED"/>
            <tx:method name="get" read-only="true"/>
            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

    传播性为多个方法之前怎么处理事物关系,是进入新事物,还是不进入之类的

    • propagation_requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。
    • propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
    • propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。
    • propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。
    • propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
    • propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。
    • propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作

    4.aop配置,在相应方法即切入点添加事物

    <!--配置aop织入事务-->
    <aop:config>
        <aop:pointcut id="txPointcut" expression="execution(* com.kuang.dao.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
    </aop:config>
  • 相关阅读:
    Note/Solution 转置原理 & 多点求值
    Note/Solution 「洛谷 P5158」「模板」多项式快速插值
    Solution 「CTS 2019」「洛谷 P5404」氪金手游
    Solution 「CEOI 2017」「洛谷 P4654」Mousetrap
    Solution Set Border Theory
    Solution Set Stirling 数相关杂题
    Solution 「CEOI 2006」「洛谷 P5974」ANTENNA
    Solution 「ZJOI 2013」「洛谷 P3337」防守战线
    Solution 「CF 923E」Perpetual Subtraction
    KVM虚拟化
  • 原文地址:https://www.cnblogs.com/cascle/p/12013422.html
Copyright © 2011-2022 走看看