美文网首页
Spring学习总结

Spring学习总结

作者: guanalex | 来源:发表于2018-03-25 17:08 被阅读99次

    这两周入门了Spring框架,接下来就是学习mybatis了,所以在学习新一个框架前,对学习的框架做一个总结,以方便新手进行学习。

    主要是学习了Spring的IOC控制反转、AOP、JDBC模板和Spring事物管理。那么我就总结一下这几方面的学习经验,主要是加上代码进行理解。

    IOC

    IOC就是把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象。在传统中当我们用的对象时通常回去NEW一个对象,但是IOC通过配置文件把对象生成,便宜实现bean的管理和操作。
    那么怎么通过配置进行bean对象的生成呢,即IOC过程,我就介绍两种方式吧,一种就是使用无参构造创建对象,另一种就是通过注解的方式生成对象。
    (1)使用无参构造生成对象

       <?xml version="1.0" encoding="UTF-8"?>
         <beans xmlns="http://www.springframework.org/schema/beans"
         xmlns:mvc="http://www.springframework.org/schema/mvc"
         xmlns:p="http://www.springframework.org/schema/p"
        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/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
        <!-- 
           说明:IOC为控制反转,把对象创建交给spring进行操作
           DI:向类的属性中设置值,在IOC上完成操作。
         -->
       <!--使用无参构造创建对象  -->
       <bean id="hell"  class="Uclass.hello"></bean>   
      </beans>
    

    当然这只是配置类对象的方式而已还不能使用,我们还需配置另一个具有hello这个类为属性的另一个类来调用hello类对象的方法。那么就涉及到注入属性的问题了,注入属性有参构造注入属性和使用Set方法注入等,那么一般都是使用set方法注入,这里以这种方法来写。

    <?xml version="1.0" encoding="UTF-8"?>
         <beans xmlns="http://www.springframework.org/schema/beans"
         xmlns:mvc="http://www.springframework.org/schema/mvc"
         xmlns:p="http://www.springframework.org/schema/p"
        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/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
    
       <bean id="hello" class="Uclass.hello"> 
       </bean> 
       <!-- 使用set注入对象属性,即属性为另一个类的对象 -->
       <bean id="demo"  class="Uclass.Demo">-->
                <!-- 
                   name的值都是属性名
                   注入对象时不能用value属性,得用ref="要注入的对象的id"
                   使用注解就可以不用在调用时使用new创建对象的操作了
                   
                 -->
    <property name="hello" ref="hello"></property>
       </bean>  
    

    使用demo调用hello方法输出hello world

    //调用hello类的对象
      //hello类
       package Uclass;
    
        public class hello {
              public void sayhello(){
               System.out.println("hello world");
             }
    }   
    
    
    
    
     package Uclass;
    
     public class Demo {
         //使用set方法注入属性
         private hello hello;
    public void sethello(hello hello) {
        this.hello = hello;
    }
    public void output(){
        System.out.println("use demo...."+hello);
        hello.sayhello();
    }
    

    (2)使用注解进行对象生成

     <?xml version="1.0" encoding="UTF-8"?>
     <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:p="http://www.springframework.org/schema/p"
    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/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
      //扫描指定包注解
    <context:component-scan base-package="Uclass"></context:component-scan>
     </beans>
    

    使用demo

     package Uclass;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    @Component(value="temp")//通过注解创建对象
     public class zhushuxing {
     @Autowired //通过注解创建属性得对象,还有@resource(name="属性名")  
     private  hello hello;
    
    public void output(){
        hello.sayhello ();
    }
    

    AOP

    AOP可以这么理解,当我们需要在许多类中添加相同逻辑(或记录等其他)代码的时候,一般我们编程会在每一个类中都写上这些代码。当需要修改的时候,我们又必须找出这些类来删除这些逻辑代码。AOP可以帮我们需要这些逻辑代码指定到类中的某个方法前面执行,或者在方法后面执行,又或者我想指定在类的某一个位置去执行它,那么这就不是复用的问题了,而是要修改类了,变成动态的了。

     <?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:aop="http://www.springframework.org/schema/aop"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
        http://www.springframework.org/schema/util
        http://www.springframework.org/schema/util/spring-util-2.0.xsd">
        
        <!-- 创建bean对象 -->
        <bean id="aop1" class="spring.aop1"></bean>
            <bean id="aop2" class="spring.aop2"></bean>
          
        <!-- 配置aop操作 -->
           <aop:config> 
           <!-- 配置切入点,即在哪个类要做插入 
            execution(* spring.aop1.add(..))为三种表达式的一种
            id="ao1"值为随便去,但下面的pointcut-ref="ao1"的值要对应
           -->
               <aop:pointcut expression="execution(* spring.aop1.add(..))"  id="ao1"/> 
             <!-- 配置切入面,即让要入的方法在本类方法之前还是之后 -->
                  <aop:aspect ref="aop2">
                     <aop:before method="delete"  pointcut-ref="ao1"/>
                   </aop:aspect>
              </aop:config>     
    </beans>
    

    这里的两个类的代码没有保存,所以就不上代码了,通过配置文件即在不用修改aop2的类代码就能调用aop1的方法在aop2进行输出。

    JDBC模板

    相对于java原生的JDBC,使用Spring的模板对数据库进行管理会更方便

    基础模板

     package jdbcTemper;
    
      import java.sql.ResultSet;
     import java.sql.SQLException;
     import java.util.List;
    
     import org.junit.Test;
     import org.springframework.jdbc.core.JdbcTemplate;
     import org.springframework.jdbc.core.RowMapper;
    import org.springframework.jdbc.datasource.DriverManagerDataSource;
    
    public class jdbc {
    @Test
    public void add(){
       //设置数据库信息
        DriverManagerDataSource dataSource=new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/guan");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");       
        //创建template模板对象,设置数据源
        JdbcTemplate jdbc=new JdbcTemplate(dataSource);
        //调用模板对象实现天加操作
        
        //String sql="insert into users value(?)";添加
        //String sql="delete from users where username=?"删除
        //String sql="update users set where username=?" 修改
        //int i=jdbc.update(sql, "spring");
        //System.out.println(i);
    ///////////////////////
    //  查询
        //查询返回某一个值
        //String sql="select count(*) from users";
        //调用jdbc Template的方法
        //int  name=jdbc.queryForObject(sql, Integer.class);
        //System.out.println(name);
    /*
     * 查询对象,第一第二步和上面的相同
     * 下面方法中第二个参数使接口rowMapper,需要自己写一个类来实现它,要new你实现接口的类,第三个参数是要查询的变量
     * */   
        //String sql="select * from users where username=?";
    //  User user=jdbc.queryForObject(sql, new myrowMapper(), "spring");
    //  System.out.println(user.getUsername());
    /**
     * 查询发回list集合
     * 
     */
    String sql ="select * from users";  
    List <User> list=jdbc.query(sql, new myrowMapper());    
        System.out.println(list);
        
        
        
      }
    
    }
      //实现查询返回对象和list集合的操作
     class myrowMapper implements RowMapper<User>{
    
            @Override
            //ResultSet和java中jdbc的一样,只是上部分已被封装了,到这一步自己实现查询
        public User mapRow(ResultSet rs, int arg1) throws SQLException {
        // TODO Auto-generated method stub
        String username= rs.getString("username");
         User user=new User();
         user.setUsername(username);
        
        return user;
    }
     
     }
    

    对于如何使用这个模板,在我学习的代码中已经注解了过程,看懂应该不难,还有就是使用配置文件和模板一起使用的方法了,这里就不介绍了。

    Spring事务管理

    Spring事物管理在我理解就是 ,事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,
    如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。
    这样可以防止出现脏数据,防止数据库数据出现问题。 开发中为了避免这种情况一般都会进行事务管理。
    在JDBC中是通过Connection对象进行事务管理的,默认是自动提交事务,可以手工将自动提交关闭,
    通过commit方法进行提交,rollback方法进行回滚,如果不提交,则数据不会真正的插入到数据库中。

    相关文章

      网友评论

          本文标题:Spring学习总结

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