springboot demo搭建

概要

  • springboot簡介
  • 搭建普通的maven項目(本例已maven為例)
  • springboot hello world例子
  • 數(shù)據(jù)庫訪問
  • 過濾器filter
  • 監(jiān)聽
  • servlet
  • 事物處理
  • 常用的變量配置
  • 按環(huán)境發(fā)布
  • 熱部署
  • 安全策略

springboot簡介

  1. Spring Boot是由Pivotal團(tuán)隊提供的全新框架蒋歌,其設(shè)計目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程鸭栖。該框架使用了特定的方式來進(jìn)行配置宵膨,從而使開發(fā)人員不再需要定義樣板化的配置。通過這種方式灾锯,Boot致力于在蓬勃發(fā)展的快速應(yīng)用開發(fā)領(lǐng)域(rapid application development)成為領(lǐng)導(dǎo)者。
  2. springboot的主要目標(biāo):
  • 為所有Spring開發(fā)提供一個基本的坪圾,更快展蒂,更廣泛的入門體驗。
  • 開箱即用乖坠,但隨著需求開始偏離默認(rèn)值搀突,快速啟動。
  • 提供大型項目(例如嵌入式服務(wù)器熊泵,安全性仰迁,度量,運行狀況檢查顽分,外部化配置)常見的一系列非功能特性徐许。
  • 絕對沒有代碼生成以及不需要XML配置,完全避免XML配置卒蘸。
  • 為了避免定義更多的注釋配置(它將一些現(xiàn)有的 Spring Framework 注釋組合成一個簡單的單一注釋)
  • 提供一些默認(rèn)值雌隅,以便在短時間內(nèi)快速啟動新項目。

搭建maven項目

springboot hello world例子

添加依賴

springboot搭建web項目非常的簡單悬秉,只需要加入父依賴和啟動包即可,啟動包里面包含了基本的依賴關(guān)系冰蘑,依賴如下:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.0.RELEASE</version>
</parent>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>1.4.0.RELEASE</version>
</dependency>

restful接口

@RestController
@EnableAutoConfiguration
public class TestController {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @RequestMapping("/hello")
    public String test2() {
        return "hello world";
    }
}

啟動入口

@Configuration
@EnableAutoConfiguration
@ComponentScan
@EnableAsync
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

這里要注意下和泌,啟動入口是會掃描所有的注解代碼,所以這里必須寫在包的最外層祠肥,不然掃描不到

到這里一個基本的springboot的hello world就已經(jīng)搭建完成了武氓,啟動Application的main方法,輸入命令:

mvn spring-boot:run

啟動完成后,在瀏覽器輸入 http://localhost:8080/hello 即可訪問。

打包

為了方便項目打包發(fā)布县恕,我們需要在pom文件里面东羹,添加maven插件,代碼如下:

<build>
    <finalName>springboottest</finalName>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <fork>true</fork>
        </configuration>
      </plugin>
    </plugins>
</build>

打包:<code>mvn package</code>
運行:<code>java -jar target/XXX.jar</code>

數(shù)據(jù)庫訪問

這里用mybatis+mysql為例

在pom文件里面添加相關(guān)依賴:

<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>1.2.0</version>
</dependency>

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.39</version>
</dependency>

配置JDBC信息:

在resources下創(chuàng)建application.yml(也可以創(chuàng)建application.properties忠烛,兩種風(fēng)格不一樣)属提,配置信息:

#數(shù)據(jù)庫
spring:
  datasource:
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://192.168.56.2:3306/test_spring_boot
    username: admin
    password: 123456

我在數(shù)據(jù)庫里面建了個user表,所以先建一個DBO對象User美尸,代買如下:

public class User {
    private int id;
    private String name;
    private Date birthday;
    private String address;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

創(chuàng)建一個mapper接口:

@Mapper
public interface UserMaper {
    @Select("select * from user where name = #{name}")
    User select(String name);
}

在TestController中新增restful接口:

@Autowired
UserMapper userMaper;

@RequestMapping("/getUser")
public User getuser(String name){
    return userMaper.select(name);
}

啟動完成后冤议,在瀏覽器輸入 http://localhost:8080/getUser?name=xinglele,查看返回結(jié)果:

{
  "id": 1,
  "name": "xinglele",
  "birthday": "2017-07-19",
  "address": "dddd"
}

過濾器filter

代買如下:

@WebFilter(filterName="myFilter",urlPatterns="/*")
@Order(2)
public class MyFilter implements Filter {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public void destroy() {
        logger.info("過濾器銷毀");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        logger.info("執(zhí)行過濾操作");
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig config) throws ServletException {
        logger.info("過濾器初始化");
    }

}

只要在類上面加一個WebFilter的注解即可师坎,其中order表示過略的順序

監(jiān)聽器

下面已監(jiān)聽容器的啟動和銷毀作為監(jiān)聽的例子恕酸,代碼如下:

@WebListener
public class IndexListener implements ServletContextListener {
    private Log log = LogFactory.getLog(IndexListener.class);

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        log.info("IndexListener contextInitialized");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {

    }
}

只要在類上面加WebListener注解即可,容器啟動和銷毀時胯陋,就會被監(jiān)聽到

servlet

代買如下:

@WebServlet(name = "IndexServlet",urlPatterns = "/hello")
public class IndexServlet extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().print("hello word");
        resp.getWriter().flush();
        resp.getWriter().close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

只要在類上面加WebServlet注解即可蕊温。

無論是filter,servlet遏乔,listener义矛,啟動的時候都需要在入口時加@ServletComponentScan注解。

springboot還提供了另一種方式
采用自己SpringBoot 配置bean的方式進(jìn)行配置的按灶,SpringBoot提供了三種BeanFilterRegistrationBean症革、ServletRegistrationBean、ServletListenerRegistrationBean
分別對應(yīng)配置原生的Filter鸯旁、Servlet噪矛、Listener,下面提供的三個配置和上面采用的方式能夠達(dá)到統(tǒng)一的效果,代碼如下:

@Bean
public ServletRegistrationBean indexServletRegistration() {
    ServletRegistrationBean registration = new ServletRegistrationBean(new IndexServlet());
    registration.addUrlMappings("/hello");
    return registration;
}

@Bean
public FilterRegistrationBean indexFilterRegistration() {
    FilterRegistrationBean registration = new FilterRegistrationBean(new IndexFilter());
    registration.addUrlPatterns("/");
    return registration;
}
@Bean
public ServletListenerRegistrationBean servletListenerRegistrationBean(){
    ServletListenerRegistrationBean servletListenerRegistrationBean = new ServletListenerRegistrationBean();
    servletListenerRegistrationBean.setListener(new IndexListener());
    return servletListenerRegistrationBean;
}

兩種方案在使用上有差別铺罢,但是在內(nèi)部SpringBoot的實現(xiàn)上是無差別的艇挨,即使使用的是Servlet3.0注解,也是通過掃描注解
轉(zhuǎn)換成這三種bean的FilterRegistrationBean韭赘、ServletRegistrationBean缩滨、ServletListenerRegistrationBean

事物

關(guān)于事務(wù)管理器,不管是JPA還是JDBC等都實現(xiàn)自接口 PlatformTransactionManager 如果你添加的是 spring-boot-starter-jdbc 依賴泉瞻,框架會默認(rèn)注入 DataSourceTransactionManager 實例脉漏。如果你添加的是 spring-boot-starter-data-jpa 依賴,框架會默認(rèn)注入 JpaTransactionManager 實例袖牙。這些對于使用者都是透明的侧巨。
使用起來很簡單,只要在啟動類上加@EnableTransactionManagement鞭达,然后在Service中司忱,被 @Transactional 注解的方法皇忿,將支持事務(wù):

@Transactional
@Override
public int update() {
    User user = new User();
    user.setId(1);
    user.setName("111");
    userMaper.update(user);


    int i = 0;
    i = 2/i;
    user.setName("222");
    userMaper.update(user);
    return 0;
}

常用的變量配置

在上個demo里面其實我們已經(jīng)用到了相關(guān)的變量,如JDBC的連接坦仍。當(dāng)然也可以設(shè)置server的端口和contentpath鳍烁,如:

#server settings
server:
  port: 8080
  context-path: /spring-boot

當(dāng)然還可以和傳統(tǒng)的spring一樣,注入一些配置常量繁扎,代碼如下:

@Component
@ConfigurationProperties(prefix = "application")
public class ApplicationProperties {
    private String name;
    private String version;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }
}

也可以直接在屬性上直接有annotation表示:

@Value("${application.name}")
String name;
application:
  name: m-test-web
  version: 0.0.1

按環(huán)境發(fā)布

springboot支持分環(huán)境打包幔荒,如生產(chǎn)環(huán)境,測試環(huán)境分開部署锻离。實現(xiàn)起來也很簡單铺峭。
在classpath下,新增application-dev.yml 和 application-prd.yml汽纠,一個是本地環(huán)境卫键,一個是生產(chǎn)環(huán)境,兩個環(huán)境的一些配置是不一樣的虱朵。
如果是idea啟動莉炉,則只要在application.yml中,加入spring.profiles.active=XX碴犬,具體指向哪個環(huán)境絮宁,那么在應(yīng)用啟動時候,就可以讀取不通的配置了服协。
如果是打完包后绍昂,使用java命令啟動應(yīng)用,也很簡單偿荷,只要在啟動的時候指定下環(huán)境即可:

java -jar target/XX.jar --spring.profiles.activ=prd

這個應(yīng)該和maven自帶的profile區(qū)分環(huán)境不一樣窘游,maven自帶的profile是在打包的時候就已經(jīng)把變量替換了,而springboot應(yīng)該是在啟動的時候把各參數(shù)初始化的跳纳,個人理解

熱部署

以前熱部署是用的破解版的jReble忍饰,這個蠻好用的,局部編譯修改的代碼寺庄,不需要重啟服務(wù)器艾蓝。
springboot自己也做了個熱部署的工具斗塘,不過這個和jReble不一樣赢织,修改完代碼后馍盟,服務(wù)器還是會重新啟動的。具體使用方式也很簡單朽合,只要在pom里面加入依賴即可使用:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-devtools</artifactId>
  <version>1.4.0.RELEASE</version>
  <optional>true</optional>
</dependency>

注意:idea必須設(shè)置成自動編譯俱两。

安全監(jiān)控

參考下:http://blog.csdn.net/king_is_everyone/article/details/53261354

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末曹步,一起剝皮案震驚了整個濱河市宪彩,隨后出現(xiàn)的幾起案子讲婚,更是在濱河造成了極大的恐慌尿孔,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筹麸,死亡現(xiàn)場離奇詭異活合,居然都是意外死亡物赶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門告嘲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奖地,“玉大人,你說我怎么就攤上這事参歹。” “怎么了犬庇?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長捎泻。 經(jīng)常有香客問我埋哟,道長,這世上最難降的妖魔是什么赤赊? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮哄孤,結(jié)果婚禮上吹截,老公的妹妹穿的比我還像新娘凝危。我一直安慰自己晨逝,他們只是感情好蛾默,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捉貌,像睡著了一般支鸡。 火紅的嫁衣襯著肌膚如雪趁窃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天瀑构,我揣著相機(jī)與錄音,去河邊找鬼检碗。 笑死码邻,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的像屋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼奏甫,長吁一口氣:“原來是場噩夢啊……” “哼凌受!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起挠进,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤誊册,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后案怯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡金砍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年恕稠,在試婚紗的時候發(fā)現(xiàn)自己被綠了至会。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谱俭。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡昆著,死狀恐怖术陶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梧宫,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布脓豪,位于F島的核電站忌卤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏驰徊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一颗味、第九天 我趴在偏房一處隱蔽的房頂上張望牺弹。 院中可真熱鬧,春花似錦张漂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垢油。三九已至圆丹,卻和暖如春滩愁,著一層夾襖步出監(jiān)牢的瞬間辫封,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工妻味, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留欣福,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓雏逾,卻偏偏與公主長得像郑临,于是被迫代替她去往敵國和親栖博。 傳聞我的和親對象是個殘疾皇子厢洞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容