spring的發(fā)展
- spring1.x
所有的配置都是通過xml文件配置bean竿秆,隨著項(xiàng)目的不斷擴(kuò)大绍绘,需要將xml配置分放到不同的配置文件中没卸,需要頻繁的在java與xml配置文件中切換
- spring2.x
隨著jdk1.5帶來的注解支持戳晌,spring就可以使用注解bean進(jìn)行申明和注入泞辐,大大減少了xml配置文件笔横,同時也大大簡化了項(xiàng)目的開發(fā)
最佳實(shí)踐:
1.應(yīng)用的基本配置用xml,比如:數(shù)據(jù)源咐吼、資源文件等
2.業(yè)務(wù)開發(fā)用注解吹缔,比如:service中注入bean等
- spring3.x到spring4.x
從spring3.x開始提供了java配置方式,使用java配置方式可以更好的理解你配置的bean,現(xiàn)在我們就處于這個時代锯茄,并且spring4.x和springBoot都推薦使用Java配置
spring的Java配置方式
Java配置是spring4.x推薦使用配置方式厢塘,完全替代xml配置
- @Configuration和@Bean
- @Configuration 作用于類上 ---- 相當(dāng)于一個xml文件
- @Bean 作用于方法上 ---- 相當(dāng)與一個bean標(biāo)簽
- 示例
使用示例演示了通過Java配置方式進(jìn)行配置spring,并且實(shí)現(xiàn)springIOC功能
- 創(chuàng)建工程以及導(dǎo)入依賴
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- 連接池 -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
- 編寫User對象
public class User {
private String username;
private String password;
private Integer age;
}
- 編寫UserDao用于模板與數(shù)據(jù)庫的交互
public class UserDAO {
public List<User> queryUserList(){
List<User> result = new ArrayList<User>();
// 模擬數(shù)據(jù)庫的查詢
for (int i = 0; i < 10; i++) {
User user = new User();
user.setUsername("username_" + i);
user.setPassword("password_" + i);
user.setAge(i + 1);
result.add(user);
}
return result;
}
}
- 編寫UserService 用于實(shí)現(xiàn)User數(shù)據(jù)操作業(yè)務(wù)邏輯
@Service
public class UserService {
@Autowired // 注入Spring容器中的bean對象
private UserDAO userDAO;
public List<User> queryUserList() {
// 調(diào)用userDAO中的方法進(jìn)行查詢
return this.userDAO.queryUserList();
}
}
- 編寫SpringConfig 用于實(shí)例化Spring容器
@Configuration //通過該注解來表明該類是一個Spring的配置肌幽,相當(dāng)于一個xml文件
@ComponentScan(basePackages = "cn.itcast.springboot.javaconfig") //配置掃描包
public class SpringConfig {
@Bean // 通過該注解來表明是一個Bean對象晚碾,相當(dāng)于xml中的<bean>
public UserDAO getUserDAO(){
return new UserDAO(); // 直接new對象做演示
}
}
- 編寫測試方法,用于啟動spring容器
public class Main {
public static void main(String[] args) {
// 通過Java配置來實(shí)例化Spring容器
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
// 在Spring容器中獲取Bean對象
UserService userService = context.getBean(UserService.class);
// 調(diào)用對象中的方法
List<User> list = userService.queryUserList();
for (User user : list) {
System.out.println(user.getUsername() + ", " + user.getPassword() + ", " + user.getPassword());
}
// 銷毀該容器
context.destroy();
}
}
讀取外部資源配置文件
通過@PropertySource可以指定讀取的配置文件牍颈,通過@Value注解獲取值迄薄,具體用法:
@Configuration //通過該注解來表明該類是一個Spring的配置,相當(dāng)于一個xml文件
@ComponentScan(basePackages = "cn.itcast.springboot.javaconfig") //配置掃描包
@PropertySource(value= {"classpath:jdbc.properties"})
public class SpringConfig {
@Value("${jdbc.url}")
private String jdbcUrl;
@Bean // 通過該注解來表明是一個Bean對象煮岁,相當(dāng)于xml中的<bean>
public UserDAO getUserDAO(){
return new UserDAO(); // 直接new對象做演示
}
}
-
如何配置多個配置文件
-
如果配置的配置文件不存在怎么辦
配置數(shù)據(jù)庫連接池
- 導(dǎo)入依賴
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
- 之前的xml配置
<!-- 數(shù)據(jù)庫連接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 配置連接池屬性 -->
<property name="driverClass" value="${jdbc.driver}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- c3p0連接池的私有屬性 -->
<property name="maxPoolSize" value="30" />
<property name="minPoolSize" value="10" />
<!-- 關(guān)閉連接后不自動commit -->
<property name="autoCommitOnClose" value="false" />
<!-- 獲取連接超時時間 -->
<property name="checkoutTimeout" value="10000" />
<!-- 當(dāng)獲取連接失敗重試次數(shù) -->
<property name="acquireRetryAttempts" value="2" />
</bean>
- 參考xml配置改造成java配置方式
@Value("${jdbc.url}")
private String jdbcUrl;
@Value("${jdbc.driverClassName}")
private String jdbcDriverClassName;
@Value("${jdbc.username}")
private String jdbcUsername;
@Value("${jdbc.password}")
private String jdbcPassword;
@Bean(destroyMethod = "close")
public DataSource dataSource() {
ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
// 數(shù)據(jù)庫驅(qū)動
comboPooledDataSource.setDriverClass(jdbcDriverClassName);
// 相應(yīng)驅(qū)動的jdbcUrl
comboPooledDataSource.setJdbcUrl(jdbcUrl);
// 數(shù)據(jù)庫的用戶名
comboPooledDataSource.setUsername(jdbcUsername);
// 數(shù)據(jù)庫的密碼
comboPooledDataSource.setPassword(jdbcUsername);
// 檢查數(shù)據(jù)庫連接池中空閑連接的間隔時間讥蔽,單位是分涣易,默認(rèn)值:240,如果要取消則設(shè)置為0
comboPooledDataSource.setIdleConnectionTestPeriodInMinutes(60);
// 連接池中未使用的鏈接最大存活時間冶伞,單位是分新症,默認(rèn)值:60,如果要永遠(yuǎn)存活設(shè)置為0
comboPooledDataSource.setIdleMaxAgeInMinutes(30);
// 每個分區(qū)最大的連接數(shù)
comboPooledDataSource.setMaxConnectionsPerPartition(100);
// 每個分區(qū)最小的連接數(shù)
comboPooledDataSource.setMinConnectionsPerPartition(5);
return comboPooledDataSource;
}
使用idea創(chuàng)建一個springBoot項(xiàng)目
springBoot和spring MVC的關(guān)系:
springBoot是MVC的升級版响禽,沒有必要的聯(lián)系
- 微服務(wù)
spring cloud徒爹,基于springBoot
刪除紅色框內(nèi)的內(nèi)容,非必須刪除內(nèi)容芋类,只是沒有用到的內(nèi)容
- springBoot的屬性配置
配置位置在
src->main->resources->新建application.properties/application.yml
application.properties
==application.yml
application.properties
書寫起來較application.yml
麻煩
server.port=8081(啟動端口) / server:
server.context-path=/exercise(啟動時的地址) / port: 8081
context-path: /exercise
application.yml
server:
port: 8081
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/dbgirl
username: root
password: root
jpa:
hibernate:
ddl-auto: create
show-sql: true
- 在配置文件中可以自定義要顯示的值
例如:
在yml文件中隆嗅,書寫
server:
port: 8081
cupSize: B
age: 20
context: "cupSize: ${cupSize},age: ${age}"
在自定義的文件中即可寫:
@Value("${cupSize}")
private 修飾符(String/Integer) cupSize;
- 部分注解
- 獲取前綴
@ConfigurationProperties(prefix="前綴名")
@Component 開啟配置
- Controller的使用
@Controller 處理HTTP請求
@RestController spring4之后的新加注解,原來返回json需要@ResponseBody配合@Controller
@RequestMapping 配置url映射
@PathVariable 獲取url中的數(shù)據(jù)
@RequestParam 獲取請求參數(shù)的值
@GetMapping 組合注解
- 事務(wù)
@Transactional