spring入门(一)

emmm,这两天才拿到offer。公司不推荐我去实习,因为补贴很低。所以我现在的局面是大量的空白时间。当然我现在需要找点事情做才行。在当时面试的时候,面试官问了一些spring的东西。当然问得很简单,但是这不由得我重新整理一下spring,当时只是简单的过了一遍没有通过文章整理(虽然用OneNote记了一次笔记,写了一些代码,但是收益不是很大)。正如之前复习javase一样,必须把基础弄夯实才能修建高楼大厦。现在我重新系统地整理一遍笔记。


spring介绍

Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式)轻量级开源框架。

特点

优点
  • 方便解耦,简化开发
    spring就是一个大工程,可以将所有对象创建和依赖关系维护,交给spring管理
  • AOP编程的支持
    spring提供了面向切面编程,可以方便实现对程序进行权限拦截,运行监控等功能
  • 方便程序的测试
    spring对Junit4支持,可以通过注解方便测试spring程序
  • 框架的直接支持
    spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀的框架的直接支持
  • 降低javaee API的使用难度
    spring 对javaee开发中非常难用的一些API(JDBC,JavaMail,远程调用)。都提供了封装,使这些API应用难度降低

个人理解:
将对象创建交给spring之后,自己就不用显式调用new创建了。这样代码里面就没有许多"多余"的new。真的逊爆了!
面向切面的好处在于对于一个方法就真的可以只做自己的事请了。就不用准备各种奇怪的东西,比如日志记录,权限检查。勇士就只应该拿上剑,去拯救公主。记录英勇事迹这种事应该交给游吟诗人!各其所职。
在我学习spring的时候,我觉得最帅的事情就是即写即所得。使用了Junit之后,代码变得十分容易测试。然后使用测试驱动开发的思想结合起来。bug胎死腹中。bug修复成本就会降到最低。
spring方便和其他秀框架集成。比如mybatis,可以直接通过一个配置就将mybatis和spring完美的整合在了一起(不要太容易好吗)。
曾经写javaee项目的时候,你最痛苦的是什么?不用多说绝对是dao层的编写。就如同下图一样的代码,真的太多太多了!!!!!!有一次我写了三十多个这种的代码,朋友不要太窒息!!!!

public List<Admin> select(String condition) {
        connection = MysqlBaseDao.getAdminConnection();// 连接数据库
        List<Admin> admins = new ArrayList<>();
        String sql = "SELECT * FROM `pesystem`.`tb_admin` where" + condition;
        System.out.println(sql);
        Admin admin = null;
        try {
            Statement stmt = connection.createStatement();
            resultSet = stmt.executeQuery(sql);
            while (resultSet.next()) {
                admin = new Admin();
                admin.setUserName(resultSet.getString("adminName"));
                admin.setUserEmail(resultSet.getString("adminEmail"));
                admin.setUserId(resultSet.getString("adminId"));
                admin.setUserTel(resultSet.getString("adminTel"));
                admin.setUserPwd(resultSet.getString("adminPwd"));
                admins.add(admin);
            }
            Iterator<Admin> iterator = admins.iterator();
            while (iterator.hasNext()) {
                System.out.println(iterator.next());
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            MysqlBaseDao.close(resultSet, preparedStatement, connection);
        }
        return admins;
    }

如果使用spring的jdbcTemplate呢?

这一部分代码来源于网络

package com.spring.dao;

import org.springframework.jdbc.core.JdbcTemplate;

import com.spring.domain.User;

public class UserDao {

    private JdbcTemplate jdbcTemplate;

    public JdbcTemplate getJdbcTemplate() {
        return jdbcTemplate;
    }

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public void addUser(User user) {

        String sql = "insert into user (username, password) values (?, ?)";

        jdbcTemplate.update(sql, user.getUsername(), user.getPassword());

    }

}

xml配置

<?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:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    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
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- IOC和DI的注解扫描 -->
    <context:component-scan base-package="com.spring" ></context:component-scan>![20180713202033735.jpg](https://upload-images.jianshu.io/upload_images/13539521-6aaf011053c651c1.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


    <!-- 打开AOP的注解 -->
    <!-- 这里用的是中间的横线而不是下划线 -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/spring_03"></property>
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="user" value="root"></property>
        <property name="password" value="123456"></property>
    </bean>

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <bean id="userDao" class="com.spring.dao.UserDao">
        <property name="jdbcTemplate" ref="jdbcTemplate"></property>
    </bean>

    <bean id="userService" class="com.spring.service.UserService">
        <property name="userDao" ref="userDao"></property>
    </bean>

</beans>

这样只需要改sql语句和一点入参什么的。模板代码就不用了!当然整合了mybatis之后,你又会惊讶~~

缺点

配置,真的令人窒息好吗?当然后面可以用springboot来改善。好的框架意味着有一个精美的牢笼,你将失去自由。对于核心设计模式和思想都会被隐藏和限定,让你窒息。

spring结构

20180713202033735.jpg

四个核心:beans,core,context,expression
测试:Junit
面向切面:aspect4j
数据访问:jdbcTemplate
web:springmvc

HelloWorld

项目目录

我使用的idea创建的spring项目并没有用maven来引入包,项目结构如下:


image.png
创建UserService接口
public interface UserService {
    void addUser();
}
创建UserServiceImpl
public class UserServiceImpl implements UserService {
    @Override
    public void addUser() {
        System.out.println("UserServiceImpl.addUser");
    }
}

配置文件
<?xml version="1.0" encoding="UTF-8"?>
<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.xsd">
    <bean id="userService" class="com.spring.helloworld.UserServiceImpl"/>
</beans>
测试
public class UserServiceImplTest {

    @Test
    public void addUserBefore(){
        UserService userService = new UserServiceImpl();
        userService.addUser();
    }
    @Test
    public void addUserByIOC() {
        String applicationContextPath = "com/spring/helloworld/applicationContext.xml";
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(applicationContextPath);
        UserService userService = (UserService) applicationContext.getBean("userService");
        userService.addUser();
    }
}
结果

addUserBeforece测试结果

"C:\Program Files\Java\jdk1.8.0_161\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 -javaagent:D:\ideaIU-2018.1.1.win\lib\idea_rt.jar=52096:D:\ideaIU-2018.1.1.win\bin -Dfile.encoding=UTF-8 -classpath "D:\ideaIU-2018.1.1.win\lib\idea_rt.jar;D:\ideaIU-2018.1.1.win\plugins\junit\lib\junit-rt.jar;D:\ideaIU-2018.1.1.win\plugins\junit\lib\junit5-rt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\rt.jar;E:\workspace\springStudy\out\production\springStudy;E:\workspace\springStudy\lib\spring-instrument-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-instrument-tomcat-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-aspects-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-context-support-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-expression-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-aop-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-jms-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-oxm-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-jdbc-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-messaging-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-tx-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-orm-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\commons-logging-1.2.jar;E:\workspace\springStudy\lib\aopalliance-1.0.jar;E:\workspace\springStudy\lib\spring-beans-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-test-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-core-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-context-4.3.18.RELEASE.jar;D:\ideaIU-2018.1.1.win\lib\junit-4.12.jar;D:\ideaIU-2018.1.1.win\lib\hamcrest-core-1.3.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 com.spring.helloworld.UserServiceImplTest,addUserBeFore
UserServiceImpl.addUser

Process finished with exit code 0

addUSerByIOC测试结果

"C:\Program Files\Java\jdk1.8.0_161\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 -javaagent:D:\ideaIU-2018.1.1.win\lib\idea_rt.jar=51709:D:\ideaIU-2018.1.1.win\bin -Dfile.encoding=UTF-8 -classpath "D:\ideaIU-2018.1.1.win\lib\idea_rt.jar;D:\ideaIU-2018.1.1.win\plugins\junit\lib\junit-rt.jar;D:\ideaIU-2018.1.1.win\plugins\junit\lib\junit5-rt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\rt.jar;E:\workspace\springStudy\out\production\springStudy;E:\workspace\springStudy\lib\spring-instrument-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-instrument-tomcat-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-aspects-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-context-support-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-expression-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-aop-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-jms-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-oxm-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-jdbc-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-messaging-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-tx-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-orm-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\commons-logging-1.2.jar;E:\workspace\springStudy\lib\aopalliance-1.0.jar;E:\workspace\springStudy\lib\spring-beans-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-test-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-core-4.3.18.RELEASE.jar;E:\workspace\springStudy\lib\spring-context-4.3.18.RELEASE.jar;D:\ideaIU-2018.1.1.win\lib\junit-4.12.jar;D:\ideaIU-2018.1.1.win\lib\hamcrest-core-1.3.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 com.spring.helloworld.UserServiceImplTest,addUserByIOC
十一月 01, 2018 9:39:42 上午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@64cee07: startup date [Thu Nov 01 09:39:42 CST 2018]; root of context hierarchy
十一月 01, 2018 9:39:42 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [com/spring/helloworld/applicationContext.xml]
UserServiceImpl.addUser

Process finished with exit code 0

看结果可以看出使用spring的有更多的输出,当然都是配置什么的东西。

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

推荐阅读更多精彩内容

  • Spring 是最受欢迎的企业级 Java 应用程序开发框架。数以百万的来自世界各地的开发人员使用 Spring ...
    LU7IN阅读 241评论 0 1
  • 相伴走过的 是光阴 留存下来的 是思绪 内心所爱的 是亲人 每次不舍的 是离别 可以坚持的 是心路 家是我的港湾
    老边顶上阅读 151评论 0 0
  • 本文首发于意得辑专家视点 自发性撤稿是否能激励科研人员主动纠错? 最近几年来,全球每年发表的论文数量已经是爆炸式增...
    意得辑专家视点阅读 2,029评论 0 0
  • 明月姐从小就喜欢唱歌跳舞,可那时连饭都吃不饱,更别说唱歌跳舞了。后来忙工作忙家庭,把自己的爱好就收藏起来了。 直到...
    欢颜589阅读 283评论 1 4