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