Spring学习总结

这两周入门了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方法进行回滚,如果不提交,则数据不会真正的插入到数据库中。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,233评论 6 495
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,357评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,831评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,313评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,417评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,470评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,482评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,265评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,708评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,997评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,176评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,503评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,150评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,391评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,034评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,063评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,796评论 6 342
  • 什么是Spring Spring是一个开源的Java EE开发框架。Spring框架的核心功能可以应用在任何Jav...
    jemmm阅读 16,449评论 1 133
  • 1 概述 本文通过HAProxy,Keepalive,实现动静分离wordpress,在每台haproxy和wor...
    ghbsunny阅读 1,932评论 1 0
  • 当大众的善良被利用,当一个父亲的爱成了“营销”,善举被说成二逼,罗尔被大众谴责。 在大众不断的谴责的同时也丢失了本...
    背着吉他浪天涯阅读 233评论 0 0