zoukankan      html  css  js  c++  java
  • spring学习笔记

    第一天
    spring概念和ioc入门(ioc操作xml配置文件)
    spring是一种一站式框架,在javaee三层结构中,每一层都提供不同的解决技术
    web     springMVC
    service    spring的ioc
    dao   spring的jdbcTemplate
    -------------------------------------------------------------------------------------
    spring的ioc操作
    1、把对象的创建交给spring进行管理
    2、ioc操作两部分
        ioc的配置文件方式
        ioc的注解方式--第二天
     
    Ioc底层原理   

    使用技术
      xml配置文件
      dom4j
      工厂设计模式
       反射
    IOC入门案例
    1、导入jar包
    Core container
        Beans   Core   Context     Spel    
    做最基本功能的时候,导入上述四个核心jar包
    导入日志相关的jar包

    2、创建类,创建方法。
    3、创建spring配置文件
            src下,建议applicationContext.xml
            引入schema约束
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
             http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
     
    <!-- ioc入门 -->
    <bean id="user" class="com.itcast.ioc.User"></bean>
     
    4、写代码测试
     
    解决eclipsede 提示问题
     
    Spring的bean管理(xml配置文件)
    bean实例化三种方式实现
        使用类的无参构造创建。(常用)
    <bean id="user" class="com.itcast.ioc.User"></bean>
        使用静态工厂创建

        使用实例工厂
     
     
    Bean标签常用属性
     
    id属性   :任意命名,不能包含特殊符号
    class属性 :创建对象所在类的全路径
    name:和id属性一样
    scope:Bean的作用范围     singleton(默认值)    prototype
     
    属性注入方式(3种)
    set方法注入(常用)
    <!-- 使用set方法注入 -->
     <bean id="demo1" class="com.itcast.proper.ProDemo1">
        <property name="username" value="joan"></property>
    </bean>
     
    public class ProDemo1 {
        private String username;
        public void setUsername(String username) {
            this.username = username;
        }
        /*public ProDemo1(String username) {
            super();
            this.username = username;
        }*/
        public void show() {
            System.out.println("demo1--------"+username);
        }
    }
     
        @Test
        public void test2() {
            
            //加载spring配置文件,根据创建对象
            ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");
            
            //得到配置创建的对象
            ProDemo1 bb=(ProDemo1) context.getBean("demo1");
            System.out.println(bb);
            bb.show();
            
        }
     
     
    有参构造注入
    <!-- 使用有参构造注入属性 -->
    <bean id="demo1" class="com.itcast.proper.ProDemo1">
        <constructor-arg name="username" value="xiaohu"></constructor-arg>
     
    public class ProDemo1 {
        private String username;
        public ProDemo1(String username) {
            super();
            this.username = username;
        }
        public void show() {
            System.out.println("demo1--------"+username);
        }
    }
     
    注入对象类型属性(重点)
    1 创建service类和dao类
         在service得到dao对象
     
    public class UserService {
        //1 定义到类型属性
        private UserDao userDao;
        //生成set方法
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
        public void add() {
            System.out.println("service.................");
            /*UserDao dao=new UserDao();
            dao.add();*/
            userDao.add();
        }
    }
    3 配置文件
    <!-- 注入对象类型的属性 -->
    <!--1 配置service和dao对象  -->
    <bean id="userDao" class="com.itcast.ioc.UserDao"></bean>
    <bean id="userService" class="com.itcast.ioc.UserService">
    <!--注入dao对象
        name属性值:service类里面属性名称
        ref属性值: dao配置bean标签中id值-->
    <property name="userDao" ref="userDao"></property>
    </bean>
     
    P名称空间注入
         <!-- p名称空间注入-->
    <bean id="person" class="com.itcast.proper.Person" p:pname="lucy"></bean>
    注入复杂类型属性
    private String[] arrs;
        private List<String> list;
        private Map<String,String> map;
        private Properties properties;
        
        public void setArrs(String[] arrs) {
            this.arrs = arrs;
        }
        public void setList(List<String> list) {
            this.list = list;
        }
        public void setMap(Map<String, String> map) {
            this.map = map;
        }
        public void setProperties(Properties properties) {
            this.properties = properties;
        }
     
    <!--注入复杂型  -->
    <bean id="person" class="com.itcast.proper.Person">
        <!--数组  -->
        <property name="arrs">
            <list>
                <value>小王</value>
                <value>小er</value>
                <value>小san</value>
                
            </list>
        </property>
        <!--  list-->
        <property name="list">
            <list>
                <value>aa</value>
                <value>bb</value>
                <value>cc</value>
                
            </list>
        </property>
        <!-- map -->
        <property name="map">
            <map>
                <entry key="1" value="lucy"></entry>
                <entry key="2" value="joan"></entry>
                <entry key="3" value="hutao"></entry>
            </map>
        </property>
        <!-- properties -->
        <property name="properties">
            <props>
                <prop key="driverclass">com.mysql.jdbc.Driver</prop>
                <prop key="username">root</prop>
                <prop key="password">176166</prop>
            </props>
        </property>
    </bean>
     
    @Test
        public void test1() {
            
            //加载spring配置文件,根据创建对象
            ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");
            
            //得到配置创建的对象
            Person person=(Person) context.getBean("person");
            System.out.println(person);
            person.test();
            
        }
     
    IOC和DI区别
    IOC   控制反转  把对象的创建交给spring进行配置
    DI   依赖注入  向类里面的属性设置值
    关系:依赖注入不能单独存在,需要在ioc基础之上完成操作
     
    Spring整合web原理
    new 对象,功能可以实现,效率很低
      实现思想:把加载配置文件和创建对象过程,在服务器启动时候完成。
    实现原理
    (1)ServletContext对象
    (2) 监听器
    (3)具体使用:
    --在服务器启动时候,为每个项目创建一个ServletContext对象
    --在ServletContext对象创建时候,使用监听器可以具体到ServletContext对象什么时候创建
    --使用监听器听到ServletContext对象创建时候,加载spring配置文件,把配置文件配置对象创建。
    把创建出来的对象放到ServletContext域对象里面(setAttribute)
    获取对象时候,到ServletContext域得到(getAttribute)
    ------------------------------------------------------------------------------------------------------
     
    第二天
    spring的ioc操作(注解)和aop概念
    1、spring的bean管理(注解)
    (1)注解创建对象
    (2)注解注入属性
    (3)xml和注解方式混合使用
        
    @注解名称(属性名称=属性值)注解
    spring注解开发准备
    1、导入jar包
           基本的jar
        aop的jar
    2 创建类,创建方法
     
    3 创建spring配置文件
    引入约束
    <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" 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"> 
     
    <!--开启注解扫描 
    (1)到包里面扫描类、方法、属性上面是否有注解
     -->
    <context:component-scan base-package="com.anno"></context:component-scan>
    <!--只会扫描属性上面的注解  -->
    <context:annotation-config></context:annotation-config>
    注解创建对象

    创建对象有四个注解
    Component   
    Controller       :web层
    Service    : 业务层
    Repository        :持久层
    目前来说,功能是一样的
     
    创建对象是单实例还是多实例
    注解注入属性
    (1)Autowired
     
    (2) Resource
     
    配置文件和注解混合使用
    2 AOP
    AOP横向抽取机制
    底层使用动态代理方式实现
     
    AOP相关术语
    Joinpoint(连接点):在类里面可以被增强的方法
    Pointcut(切入点):实际被增强的方法称为切入点
    Advice(通知/增强):增强的逻辑,称为增强,比如扩展日志功能,这个日志功能称为增强
        前置通知 before
        后置通知 after
        异常通知 exception
        最终通知  final
        环绕通知  around 在方法之前和之后执行
     
    Aspect(  切面):把增强应用到具体方法上面,过程称为切面。
        Introduction引入   
         Target  代理目标对象(要增强的类)
          Weaving 织入 :是把增强应用到目标的过程  advice应用到target的过程
          Proxy  代理
    Spring的aop操作
     
    1 使用aspectj实现
       aspectj不是spring的一部分,和spring一起使用进行aop操作
        spring2.0以后新增了对Aspectj支持
    2 使用aspectj实现aop有两种方式
    (1)基于aspectj的xml配置
    (2)基于aspectj的注解方式
    Aop操作准备
    1、基本jar包+aop相关jar
     
    约束
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        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/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
     
    使用表达式配置切入点
        1 切入点:实际增强的方法
        2 常用的表达式:
    execution(<访问修饰符>?<返回类型><方法名>()
    execution(* com.aop.Book.add(..))
    execution(* com.aop.Book.*(..))
    execution(*.*.*.(..))
     
     
    <!-- 1 配置对象 -->
    <bean id="book" class="com.aop.Book"></bean>
    <bean id="myBook" class="com.aop.MyBook"></bean>
    <!-- 2 配置aop操作 -->
    <aop:config>
    <!-- 2.1 配置切入点-->
        <aop:pointcut expression="execution(*.com.aop.Book.*(..))" id="pointcut1"/>
    <!--2.2 配置切面  
        把增强用到方法上面-->
        <aop:aspect ref="myBook">
        <aop:before method="before1" pointcut-ref="pointcut1"/>
        </aop:aspect>
    </aop:config>
     
     
    //环绕通知
        public void around1(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
            System.out.println("之前...........");
            //执行被增强的方法
            proceedingJoinPoint.proceed();
            System.out.println("之后。。。。。。。。。");
        }
    Log4介绍
        1 导入jar
    2  配置文件 (src下)log4j.properties
    ----------------------------------------------------------------------
    Spring整合web项目演示
    常规配置,每次访问action时,都会加载spring配置文件
    2 解决方案:
      在服务器启动时候,创建对象加载配置文件
     底层使用ServletContext对象
    3 在spring里面不需要我们自己写代码实现
       封装了一个监听器,只需要配置监听器
       配置监听器之前导入spring整合web项目jar包
    在web.xml中
    ------------------------------------------------------------------------------------------------------------
     
    第三天
     
    基于aspectj的注解aop
     
    1 使用注解方式实现aop操作
    第一步  创建对象
    第二步:开启aop操作
    <!--开启aop操作  -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    第三步:在增强类上使用注解
     
    jdbcTemplate和spring管理事物
    jdbcTemplate对jdbc进行封装
     
    CRUD
    增加
     导入jar包
    数据库驱动jar
     
    @Test
        public void add() {
            //设置数据库信息
            DriverManagerDataSource dataSource=new DriverManagerDataSource();
            dataSource.setDriverClassName("com.mysql.jdbc.Driver");
            dataSource.setUrl("jdbc:mysql:///spring_day03");
            dataSource.setUsername("root");
            dataSource.setPassword("176166");
            //
            JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);
            //添加
            /*String sql="insert into user value(?,?)";
            int row=jdbcTemplate.update(sql,"lucy","250");*/
            //修改
            /*String sql="update user set password=? where username=?";
            int row=jdbcTemplate.update(sql,"1234","lucy");*/
            //删除
            String sql="delete from user where username=?";
            int row=jdbcTemplate.update(sql,"lucy");
            System.out.println(row);
        
        }
    查询
    1 查询返回一个值
     
    2 查询返回对象
    //查询返回对象
            String sql="select * from user where username=?";
            User user=jdbcTemplate.queryForObject(sql, new MyRowMapper(), "lucy");
            System.out.println(user);
     
    class MyRowMapper implements RowMapper<User>{
        @Override
        public User mapRow(ResultSet rs, int arg1) throws SQLException {
            //1 从结果集中得到数据
            String username=rs.getString("username");
            String password=rs.getString("password");
            //数据封装到对象里面
            User user=new User();
            user.setUsername(username);
            user.setPassword(password);
            return user;
        }
        
    }
        //查询返回list集合
            String sql="select * from user";
            List<User> list=jdbcTemplate.query(sql, new MyRowMapper());
            System.out.println(list.size());
     
    Spring配置连接池和dao使用jdbcTemplate
    1 c3p0连接池
        第一步导入jar包  c3po      mchange-commoms
     
    2 创建spring配置文件   配置连接池
        1  
        2 dao使用jdbcTemplate

    Spring的事务管理
     1 事务概念 特性,不考虑隔离性产生问题()    设置隔离级别
     
     
    Spring事务管理两种方式
       编程式
       声明式(基于xml    ,  基于注解)
    spring的事务管理api
     
    为不同的dao层框架,提供接口不同的实现类
        配置事务管理器
     
    搭建转账环境
    1 创建数据库表
    2 创建service和dao类,完成注入
    <bean id="ordersService" class="com.service.OrdersService">
        <property name="ordersDao" ref="userDao"></property>
    </bean>
    <bean id="ordersDao" class="com.dao.OrdersDao">
        <property name="jdbcTemplate" ref="jdbcTemplate"></property>
    </bean>
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"></property>
    </bean>
    (1)service层又叫业务逻辑层
    (2)dao层
    <!--配置c3p0连接池  -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <!--注入属性值  -->
    <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
    <property name="jdbcUrl" value="jdbc:mysql:///spring_day03"></property>
    <property name="user" value="root"></property>
    <property name="password" value="176166"></property>
    </bean>
    <bean id="ordersService" class="com.service.OrdersService">
        <property name="ordersDao" ref="ordersDao"></property>
    </bean>
    <bean id="ordersDao" class="com.dao.OrdersDao">
        <property name="jdbcTemplate" ref="jdbcTemplate"></property>
    </bean>
    <!-- 创建jdbcTemplate对象 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
     
    出现异常,进行事务回滚。
    声明式事务管理(xml配置)
    1 配置文件方式使用aop思想配置
        第一步:配置事务管理器
    <!--配置事务管理器  -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    第二步:配置事务的增强
    <!-- 配置事务的增强 -->
    <tx:advice id="txadvice" transaction-manager="transactionManager">
        <!--做事务操作  -->
        <tx:attributes>
            <tx:method name="account*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>
    第三步:配置切面
    <!-- 配置切面 -->
    <aop:config>
    <!--  切入点-->
        <aop:pointcut expression="execution(* com.service.OrdersService.(..))" id="pointcut1"/>
        <!-- 切面 -->
        <aop:advisor advice-ref="txadvice" pointcut-ref="pointcut1"/>
    </aop:config>
    解决了异常会自行回滚。
    声明式事务管理(注解)
    第一步AND第二步
    <!-- 配置事务管理器  -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!-- 开启事务注解-->
    <tx:annotation-driven transaction-manager="transactionManager"/>
    第三步
     
     
    第四天
    ssh整合  struts2+hibernate5.x+spring4.x
    1 spring整合struts2
     
     

    默认的情况下spring会从web-inf目录下去找spring的配置文件,并且spring的配置文件名是applicationContext.xml.
     
    web.xml
        <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
        </context-param>
        <filter>
            <filter-name>struts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    2 spring整合hibernate
    一  导入hibernate的jar包
    strutes 和hibernate有重复的jar
    删除低版本的jar
    导入SSH整合的jar
    二   搭建hibernate环境
      1 创建实体类
    2 配置实体类映射关系
    3 创建核心配置文件
    三  把hibernate核心配置文件啊数据库配置在spring中进行配置

    四  把hibernate的sessionFactory交给spring配置
    spring中进行了封装
    ssh整合代码:https://github.com/hutaoying/ssh_demo
     
     
  • 相关阅读:
    IE下CSS属性float:right下换行问题解决方法
    php 中简单输出 csv和excel
    VMware 链接网络的三种模式及自己的安装方法
    ajax的应用
    php中ADODB的用法
    关于web 标准的常见问题 总结
    javascript 闭包
    php strrev 中文字符串翻转乱码的问题
    注册表 一览
    SVN Commit报错 svn: E155037: Previous operation has not finished; run 'cleanup' if it was interrupted
  • 原文地址:https://www.cnblogs.com/joan-HTY/p/9011154.html
Copyright © 2011-2022 走看看