springboot项目中的注解 启动项目的方式 解决spring的bean.xml配置不生效 spring的基础JDBC配置
依賴
創(chuàng)建一個 Spring Boot 工程時,可以繼承自一個 spring-boot-starter-parent ,也可以不繼承
先來看 parent 的基本功能有哪些?
賴,所以我們在寫依賴時才不需要寫版本號。
配置文件,例如 application-dev.properties 和 application-dev.yml。
如果Spring Boot 項目要繼承自公司內(nèi)部的 parent ,這個時候該怎么辦呢?
一個簡單的辦法就是我們自行定義 dependencyManagement 節(jié)點,然后在里邊定義好版本號,再接下來在引用依賴時也就不用寫版本號了
注解
編寫啟動類 控制器
編寫啟動類:【項目的入口。】
,在Maven 工程的java 目錄下創(chuàng)建項目的包,包里創(chuàng)建一個App 類,
代碼如下:
可以直接使用組合注解@Spring BootApplication 來代替@EnableAutoConfiguration 和@ComponentScan ,
@EnableAutoConfiguration 注解表示開啟自動化配直。由于項目中添加了spring-boot-starterweb依賴, 因此在開啟了自動化配置之后會自動進行Spring 和SpringMVC 的配置。
在Java 項目的main 方法中,通過SpringApplication 中的m 方法啟動項目。第一個參數(shù)傳入App.class ,告訴Spring 哪個是主要組件。第二個參數(shù)是運行時輸入的其他參數(shù)。
接下來創(chuàng)建一個SpringMVC 中的控制器-HelloController,代碼如下:
在控制器中提供了一個"/hello "接口,此時需要配置包掃描才能將HelloController 注冊到SpringMVC 容器中,因此在App 類上面再添加一個注解@ComponentScan 進行包掃描
也可以直接使用組合注解@SpringBootApplication 來代替@EnableAutoConfiguration 和@ComponentScan ,
啟動項目有三種不同的方式
可以直接使用mvn 命令啟動項目,命令如下
mvn springboot : run
啟動成功后,在瀏覽器地址欄輸入“http://localhost: 8080/hello ”即可看到運行結(jié)果
3… 打包啟動
當(dāng)然, Spring Boot 應(yīng)用也可以直接打成jar 包運行。在生產(chǎn)環(huán)境中,也可以通過這樣的方式來
運行一個Spring Boot 應(yīng)用。要將S pring Boot 打成jar 包運行,首先需要添加一個plugin 到pom.xml
文件中,代碼如下:
然后運行mvn 命令進行打包,代碼如下
mvn package
打包完成后,在項目的target 目錄下會生成一個jar 文件,通過java -jar 命令直接啟動這個jar文件,
即java -jar xxxx.jar
組合注解configuration
@Spring BootApplication 實際上是一個組合注解,定義如下:
@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan ( excludeFilters= { @Filter(type = FilterType . CUSTOM , classes= TypeExcludeFilter .class), @Filter (type = FilterType.CUSTOM , classes =AutoConfigurationExcludeFilter . class) } ) public @interface Spring BootApplication {}第一個@SpringBootConfiguration 的定義如下:
@Configuration
public @interface SpringBootConfiguration {}
原來就是一個@Configuration ,所以@Spring BootConfiguration 的功能就是表明這是一個配置
類,開發(fā)者可以在這個類中配置Bean。從這個角度來講,這個類所扮演的角色有點類似于Spring中ApplicationContext.xml 文件的角色。
注解@EnableAutoConfiguration 表示開啟自動化配置。Spring Boot 中的自動化配置是非侵入式的,在任意時刻,開發(fā)者都可以使用自定義配置代替自動化配置中的某一個配置。
③注解@ComponentScan 完成包掃描,也是Spring 中的功能。由于@ComponentScan 注解默認掃描的類都位于當(dāng)前類所在包的下面, 因此建議在實際項目開發(fā)中把項目啟動類放在根包中
開發(fā)者可以創(chuàng)建一個新的類專門用來配置Bean ,這樣便于配置的管理。這個類只需要加上@Configuration 注解即可
@Configuration
public class Myconfig{}
項目啟動類中的@ComponentScan 注解,除了掃描@Service , @Repository 、@Component 、@Controller 和@RestController 等之外,也會掃描@Configuration 注解的類。
@ConfigurationProperties注解可以將對程序內(nèi)變量的賦值提取到配置文件中。
如:
修改application.yml:
file:
upload-dir: ./assets
啟動類加上:
@EnableConfigurationProperties({BlogProperties.class, FileStorageProperties.class})
基于@Transactional注解的聲明式事務(wù)管理
Spring的聲明式事務(wù)管理,是通過AOP技術(shù)實現(xiàn)的事務(wù)管理,其本質(zhì)是對方法前后進行攔截,然后在目標(biāo)方法開始之前創(chuàng)建或者加入一個事務(wù),在執(zhí)行完目標(biāo)方法之后根據(jù)執(zhí)行情況提交或者回滾事務(wù)。 聲明式事務(wù)管理最大的優(yōu)點是不需要通過編程的方式管理事務(wù),因而不需要在業(yè)務(wù)邏輯代碼中摻雜事務(wù)處理的代碼,只需相關(guān)的事務(wù)規(guī)則聲明,便可以將事務(wù)規(guī)則應(yīng)用到業(yè)務(wù)邏輯中。通常情況下,在開發(fā)中使用聲明式事務(wù)處理,不僅因為其簡單,更主要是因為這樣使得純業(yè)務(wù)代碼不被污染,極大地方便了后期的代碼維護。
和編程式事務(wù)管理相比,聲明式事務(wù)管理唯一不足的地方是,最細粒度只能作用到方法級別,無法做到像編程式事務(wù)管理那樣可以作用到代碼塊級別。但即便有這樣的需求,也可以通過變通的方法進行解決,例如,可以將需要進行事務(wù)處理的代碼塊獨立為方法。Spring的聲明式事務(wù)管理可以通過兩種方式來實現(xiàn),一是基于XML的方式,一是基于@Transactional注解的方式。 @Transactional注解可以作用于接口、接口方法、類以及類方法上。當(dāng)作用于類上時,該類的所有public方法都將具有該類型的事務(wù)屬性,同時,也可以在方法級別使用該注解來覆蓋類級別的定義。雖然@Transactional注解可以作用于接口、接口方法、類以及類方法上,但是Spring小組建議不要在接口或者接口方法上使用該注解,因為只有在使用基于接口的代理時它才會生效??梢允褂?#64;Transactional注解的屬性定制事務(wù)行為,具體屬性如表1.3所示。
具體實現(xiàn)步驟如下。
如何在事務(wù)處理中捕獲異常
聲明式事務(wù)處理的流程是: (1)Spring根據(jù)配置完成事務(wù)定義,設(shè)置事務(wù)屬性。 (2)執(zhí)行開發(fā)者的代碼邏輯。 (3)如果開發(fā)者的代碼產(chǎn)生異常(如主鍵重復(fù))并且滿足事務(wù)回滾的配置條件,則事務(wù)回滾;否則,事務(wù)提交。
現(xiàn)在的問題是,如果開發(fā)者在代碼邏輯中加入了try…catch…語句,Spring還能不能在聲明式事務(wù)處理中正常得到事務(wù)回滾的異常信息?答案是不能。這是因為默認情況下,Spring只在發(fā)生未被捕獲的RuntimeExcetpion時才回滾事務(wù)。如何在事務(wù)處理中捕獲異常呢?具體修改如下
(1)修改@Transactional注解。 需要將TestServiceImpl類中的@Transactional注解修改為: @Transactional(rollbackFor={Exception.class})
//rollbackFor指定回滾生效的異常類,多個異常類逗號分隔;
//noRollbackFor指定回滾失效的異常類
(2)在catch語句中添加“throw new RuntimeException();”語句。 注意:在實際工程應(yīng)用中,在catch語句中添加“TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();”語句即可。也就是說,不需要在@Transaction注解中添加rollbackFor屬性。
JDBC配置
spring jdbc的配置
xml配置:
Spring JDBC的XML配置主要使用Spring JDBC模塊的core和dataSource包進行Spring數(shù)據(jù)庫編程。core包是JDBC的核心功能包,包括常用的JdbcTemplate類;dataSource包是訪問數(shù)據(jù)源的工具類包。使用Spring JDBC操作數(shù)據(jù)庫,需要對其進行配置。XML配置文件示例代碼如下:
java配置:
package config;import org. springframework. beans. factory. annotation. Value;import org. springframework. context. annotation. Bean;import org. springframework. context. annotation. ComponentScan;import org. springframework. context. annotation. Configuration;import org. springframework. context. annotation. PropertySource;import org. springframework. jdbc. core. JdbcTemplate;import org. springframework. jdbc. datasource. DriverManagerDataSource;Configuration/通過該注解來表明該類是一個 Spring的配置,相當(dāng)于一個xm文件 @ ComponentScan(basePackages="dao")/配置掃描包PropertySourcevalue=(value={"classpath:jdbc. properties"}, ignoreResourceNotFound=true) //配置多個屬性文件時value={"classpath jdbc.properties","xx","xxx”}public class SpringJDBCConfig@Value("s{jdbc.url}") //注入屬性文件jdbc. properties中的jdbc.urprivate String jdbcUrl;@Value("$ {jdbc. driverClassName}")private String jdbcDriverClassName;@Value("$ {jdbc. username}")private String jdbcUsername; @Value("sjdbc. password}")private String jdbcPassword; /** *配置數(shù)據(jù)源 **/@Beanpublic DriverManagerDataSource dataSource(){DriverManagerDataSource myDataSource =new DriverManagerDataSource() //數(shù)據(jù)庫驅(qū)動myDataSource. setDriverClassName(jdbcDriverClassName); //相應(yīng)驅(qū)動的jdbcUrlmyDataSource. setUrl( jdbcUr1) //數(shù)據(jù)庫的用戶名myDataSource. setUsername(jdbcUsername); //數(shù)據(jù)庫的密碼myDataSource. setPassword( jdbcUsername);return myDataSource; /** 配置 JdbcTemplate **/ @Bean( value="jdbcTemplate")public JdbcTemplate getJdbcTemplate(){return new JdbcTemplate( dataSource()); } }上述Java配置示例中,需要事先在classpath目錄(如應(yīng)用的src目錄)下創(chuàng)建屬性文件,代碼如下:
jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/springtest?characterEncoding=utf8 jdbc.username=root jdbc.password=root另外,在數(shù)據(jù)訪問層(如Dao類)使用jdbcTemplate時,也需要將jdbcTemplate注入對應(yīng)的Bean中,代碼如下:
@Repositorypublic class TestDaoImpl implements TestDao{@Autowired //使用配置文件中的JDBC模板private JdbcTemplate jdbcTemplate; }獲取JDBC模板后,要知道如何使用它,需要了解JdbcTemplate類的常用方法——update()和query()方法。
· public int update(String sql,Object args[])
該方法可以對數(shù)據(jù)表進行增加、修改、刪除等操作。使用args[]設(shè)置SQL語句中的參數(shù),并返回更新的行數(shù)。代碼如下: String insertSql=“insert into user values(null,?,?)”;
Object param1[]={“chenheng1”,“男”};
jdbcTemplate.update(sql,param1);
· public List query(String sql,RowMapper rowMapper,Object args[])
該方法可以對數(shù)據(jù)表進行查詢操作。rowMapper將結(jié)果集映射到用戶自定義的類中**(前提是自定義類中的屬性要與數(shù)據(jù)表的字段對應(yīng)**)。代碼如下:
數(shù)據(jù)庫配置的屬性文件jdbc.properties,具體內(nèi)容如下:
jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/springtest?characterEncoding=utf8 jdbc.username=root jdbc.password=root在應(yīng)用的src目錄下,創(chuàng)建config包,并在該包中創(chuàng)建配置類SpringJDBCConfig。在該配置類中使用@PropertySource注解讀取屬性文件jdbc.properties,并配置數(shù)據(jù)源和JdbcTemplate,具體代碼如下:
package config;import org.springframework.beans.factory.annotation. Value;import org.springframework.context.annotation.Bean;import org. springframework.context.annotation. ComponentScan;import org.springframework.context.annotation. Configuration;import org.springframework.context.annotation. PropertySource;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.datasource. DriverManagerDataSource; // Configuration通過該注解來表明該類是一個 Spring的配置,相當(dāng)于一個xml文件ComponentScan(basePackages={"dao","service"})//配置掃描包PropertySource(value{"classpath:jdbc. properties"}, ignoreResourceNo=true)public class SpringJDBCConfigvalue("$ {jdbc. url}") //注入屬性文件jdbc. properties中的jdbc.urlprivate String jdbcUrl;value("s{jdb. driverClassName}")private String jdbcDriverClassName;@Value("$ {jdbc. username)")private String jdbcUsername;@Value(" ${jdbc. password}")private String jdbcPassword; //配置數(shù)據(jù)源 /@Beanpublic DriverManagerDataSource dataSource(){DriverManager DataSource myDataSource new DriverManagerDataSource(); //數(shù)據(jù)庫驅(qū)動myDataSource. setDriverClassName( jdbcDriverClassName); /相應(yīng)驅(qū)動的jdbcUr11myDataSource. setUrl( jdbcUr1) //數(shù)據(jù)庫的用戶名myDataSource. setUsername( jdbcUsername); //數(shù)據(jù)庫的密碼myDataSource. setPassword( jdbcUsername)return myDataSource; } //配置 JdbcTemplate@Bean(value="jdbcTemplate")public JdbcTemplate getJdbcTemplate(){return new JdbcTemplate( dataSource()) }src下創(chuàng)建entity包,創(chuàng)建實體類MyUser"
package entity;public class Myuser{private Integer uiaiprivate String uname;private string usexi 省略set和get方法public String toString(){return " [uid=" I uid +" uname ="+ uname+, usex "= usex +"]"}}數(shù)據(jù)訪問層
src目錄下,創(chuàng)建dao包,在該包中創(chuàng)建數(shù)據(jù)訪問接口TestDao和接口實現(xiàn)類TestDaoImpl。在實現(xiàn)類TestDaoImpl中使用@Repository注解標(biāo)注此類為數(shù)據(jù)訪問層,并使用@Autowired注解依賴注入JdbcTemplate。
TestDaompl.java:
package dao;import java. util. List;import org. springframework.beans.factory.annotation. Autowired;import org. springframework.jdbc.core. BeanPropertyRowMapper;import org. springframework.jdbc.core.JdbcTemplate;import org. springframework.jdbc.core.RowMapper;import org. springframework.stereotype.Repository;import entity. MyUser;@Repositorypublic class TestDaoImpl implements TestDao{@Autowired //使用配置類中的JDBC模板private JdbcTemplate jdbcTemplate; /**更新方法,包括添加、修改、刪除param為sql中的參數(shù),如通配符? **/@Overridepublic int update(String sql, Object[ param){return jdbcTemplate. update(sql, param); }/**查詢方法param為sql中的參數(shù),如通配符? **/@Overridepublic List< MyUser> query(String sql, Object[] param){RowMapper<MyUser> rowMapper= new BeanPropertyRowMapper< MyUser>(MyUser.class);return jdbcTemplate. query(sql, rowMapper); } }創(chuàng)建業(yè)務(wù)邏輯層
src目錄下,創(chuàng)建service包,在該包中創(chuàng)建數(shù)據(jù)訪問接口TestService和接口實現(xiàn)類TestServiceImpl。在實現(xiàn)類TestServiceImpl中使用**@Service注解標(biāo)注此類為業(yè)務(wù)邏輯層,并使用@Autowired注解依賴注入TestDao。**
TestService.java
TestServiceImpl.java
package service;import java. util.List;import org. springframework. beans. factory. annotation. Autowired;import org. springframework. stereotype. Service;import dao. TestDao;import entity. MyUser;Servicepublic class TestServiceImpl implements TestServiceAutowiredpublic TestDao testDao;Overridepublic void testJDBC(){String insertSql="insert into user values(null,?,?)"; //數(shù)組 param的值與 insertSql語句中的?一一對應(yīng)Object param1[]={"chenheng11","男"};Object param2[]={"chenheng22","女"};Object param3[] ={"chenheng3", ""}Object param4[] {"chenheng4", ""} //添加用戶testDao. update(insertSql, param1);testDao. update(insertSql, param2);testDao. update(insertSql, param3);testDao. update(insertSql, param4); //查詢用戶String selectSql ="select from user"; List< MyUser>list= testDao. query( selectSql,null);for(MyUser mu: list){System. out. println(mu); } }解決配置不生效
@ImportResource
@ImportResource:導(dǎo)入Spring的配置文件,讓配置文件生效。
示例:
boot.service.HelloService:
放在resource下的bean.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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="helloService" class="boot.service.HelloService"></bean> </beans>BootApplicationTests.java
import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.ApplicationContext; import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class) @SpringBootTest public class BootApplicationTests {@AutowiredApplicationContext ioc;@Testpublic void testConfig() {boolean b = ioc.containsBean("helloService");System.out.print(b);}}運行結(jié)果:
試圖通過添加一個Spring的配置文件bean.xml來把HelloService注入進去。
運行測試類結(jié)果:false
結(jié)果表明IoC容器中并不包含HelloService,即:配置文件bean.xml沒有生效
解決方式
方式一: 主程序中進行配置@ImportResouece注解
先運行主程序,然后再啟動剛剛的測試類,現(xiàn)在輸出:
可以看到已經(jīng)是true
方法二:通過配置類實現(xiàn),這種方式也是Spring Boot推薦的
@Configuration
注意,這個config文件一定要在與測試類一樣的包下,否則不能成功添加組件,導(dǎo)致輸出仍然是false
文件目錄:
(其中MyConfig為配置類,鼠標(biāo)所在位置為測試類)
@Configuration標(biāo)注這是一個配置類
通過@Bean注解,將方法的返回值添加到容器之中,并且容器中這個組件的id就是方法名
2. 把主程序類中@ImportResource()配置注釋掉
3. 測試成功,添加了HelloService()組件
Web 容器配置
1.在Spring Boot 項目中,可以內(nèi)置Tomcat 、Jetty 、Undertow 、Netty 等容器。當(dāng)開發(fā)者添加了
spring-boot-starter-web 依賴之后, 默認會使用Tomcat 作為Web 容器。如果需要對Tomcat 做進一步的配置,可以在application.properties 中進行配置,代ti馬如下:
server .port=8081
server . error .path=/error
server . servlet .session.timeout=30m
server . servlet.context- path=/chapter02
se rver . tomcat.uri encodi ng=utf- 8
server .tomcat.max-threads=500
server . tomcat.basedir=/home/sang/tmp
server.port Web 容器的端口號。
error.path 當(dāng)項目出錯時跳轉(zhuǎn)去的頁面。
session.timeout :session 失效時間, 30m 表示30 分鐘,如果不寫單位, 默認單位是秒。
由于Tomcat 中配直session 過期時間以分鐘為單位, 因此這里單位如果是秒的話,該時間會被轉(zhuǎn)換為一個不超過所配直秒數(shù)的最大分鐘數(shù), 例如這里配置了119 ,默認單位為秒,則實際session 過期時間為1 分鐘。
? context-path 表示項目名稱, 不配置時,默認為/。如果配置了,就要在訪問路徑中加上配直的路徑。
? uri-encoding 表示配直Tomcat 請求編碼。
? max - threads 表示Tomcat 最大線程數(shù)。
? basedir 是一個存放Tomcat 運行日志和臨時文件的目錄,若不配,則默認使用系統(tǒng)的臨時目錄。
2.HTTPS 配置
由于HTTPS 具有良好的安全性,在開發(fā)中得到了越來越廣泛的應(yīng)用, 像微信公眾號、小程序等的開發(fā)都要使用HTTPS 來完成。對于個人開發(fā)者而言, 一個HTTPS 證書的價格還是有點貴,國內(nèi)有一些云服務(wù)器廠商提供免費的H TTPS 證書, 一個賬號可以申請數(shù)個。不過在jdk 中提供了一個Java 數(shù)字證書管理工具keytool , 在\jdk\bin 目錄下,通過這個工具可以自己生成一個數(shù)字證書,
生成命令如下:
? keytool -genkey -alias tomcathttps - keyalg RSA-keysize 2048 - keystore sang. p12-validity 365
? -genkey 表示要創(chuàng)建一個新的密鑰。
? -alias 表示keystore 的別名。
? -keya lg 表示使用的加密算法是RSA , 一種非對稱加密算法.
? -keysize 表示密鑰的長度.
? -keystore 表示生成的密鑰存放位直。
? -validity 表示密鑰的有效時間,單位為天
總結(jié)
以上是生活随笔為你收集整理的springboot项目中的注解 启动项目的方式 解决spring的bean.xml配置不生效 spring的基础JDBC配置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VUE内置组件 vue使用插槽分发内容
- 下一篇: IDEA第一个mybatis程序 myb