D41-Spring(02整合連線池)
阿新 • • 發佈:2019-01-05
一、全xml
- spring除了管理自己編寫的資源,還可以管理第三方的資源。
步驟:
- 匯入連線池和mysql驅動,jdbcTemplate的座標(在pom.xml檔案中)
- 將第三方的物件交給spring的ioc容器
<!-- 自己編寫的資源也可以交給ioc容器建立並管理
accountDao-->
<bean id="accountDao" class="com.daoimpl.AccountDaoImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
<!--accountService-->
<bean id="accountService" class="com.serviceimpl.AccountServiceImpl">
<property name="accountDao" ref="accountDao"></property>
</bean>
- 通過spring的依賴注入(DI)設定屬性值。
- 優化:
-
- 在spring的配置檔案中載入外部的資料庫連線資訊properties 配置檔案,在內部通過el表示式${key}的方式獲取。
<!--讓spring去載入第三方的jdbc.properties配置檔案
標籤:<context>
使用:el表示式${key}
-->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder >
- 連線池
<!-- druid -->
<bean id="druid" class="com.alibaba.druid.pool.DruidDataSource">
<!--set 屬性-->
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--JdbcTemplet
new JdbcTemplet();
new JdbcTemplet("連線池");
-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--通過構造器設定屬性-->
<constructor-arg name="dataSource" ref="druid"></constructor-arg>
</bean>
- 測試類:
DruidDataSource druidDataSource = new DruidDataSource();
//使用mysql驅動
druidDataSource.setDriverClassName("com.mysql.jdbc.Driver");
druidDataSource.setUrl("jdbc:mysql:///day02_spring");
druidDataSource.setUsername("root");
druidDataSource.setPassword("root");
DruidPooledConnection connection = druidDataSource.getConnection();
System.out.println(connection);
二、半xml半註解方式
2.1 需求:要使用ioc的 半xml半註解 的方式完成資料庫的操作
-
半xml半註解:自己的資源用註解代替,第三方的資源全部保留xml配置
-
純註解方式: 自己的資源和第三方資源全部用註解的方式。
-
半xml半註解的使用條件:
-
- spring對註解預設是關閉的,需要配置一個註解掃描器,開啟註解並掃描資源。
-
- 註解掃描器的作用: 在指定的包路徑下(包含子路徑)解析新增的註解。使用標籤< context >開啟註解。
<!--開啟掃描器-->
<context:component-scan base-package="com" ></context:component-scan>
- 載入第三方資源
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
- 建立druid連線池並與JdbcTemplate繫結
<bean id="druid" class="com.alibaba.druid.pool.DruidDataSource">
<!--set 屬性-->
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--JdbcTemplet
new JdbcTemplet();
new JdbcTemplet("連線池");
-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--通過構造器設定屬性-->
<constructor-arg name="dataSource" ref="druid"></constructor-arg>
</bean>
2.2 註解整理
2.2.1 建立物件的註解
- @Component
- @Controller — web層(控制層)
- @Service —service層(業務邏輯層)
- @Repository ----dao層(持久層)
- 需要配置在類上
- 預設該物件在spring容器中的唯一標識(id):就當前類名首字母小寫
- 如果使用Value屬性:可以指定唯一標識(id)
- 這4個註解可以隨便用,但是建議按照分層方式對應註解。
@Component(value = "accountService")
//<bean id="accountService" class="com.serviceimpl.AccountServiceImpl">
public class AccountServiceImpl implements AccountSerivce {
//spring解析到這個註解,會自動去自己的ioc容器中找當前這個型別(介面)的物件,並自動賦值
@Autowired
@Qualifier(value = "accountDao1")
private AccountDao accountDao;
public void delete() {
//呼叫dao
accountDao.delete();
}
2.2Spring提供的物件屬性的依賴注入註解
- @Autowired:
-
- 預設按照型別(介面)從容器中查詢物件並注入。如果該容器中有多個該介面的物件,可以使用下面註解配套
-
- @Qualifier:
-
-
- 按照指定的唯一標識從容器中查詢物件並注入。value: 指定唯一標識(id)
-
@Repository(value = "accountDao1")
public class AccountDaoImpl implements AccountDao {
@Autowired //依賴註解
private JdbcTemplate jdbcTemplate;
public void delete() {
String sql="delete from account";
jdbcTemplate.update(sql);
}
2.3 JDK提供的依賴注入註解(@[email protected](value=id唯一標識名))
- @Resource: 按照唯一標識從容器中查詢物件並注入。
- · Name: 指定唯一標識
2.4 簡單屬性的依賴註解
- @Value:
-
- 注入基本資料型別
-
- 注入被spring容器管理的properties檔案中的內容
-
-
- 將properties交給spring容器管理
-
-
-
- 使用spring-el表示式獲取,@Value="${properties檔案中的key}"
-
- AccountDaoImpl2類下
@Repository(value = "accountDao2")
@Scope(value = "singleton") // 預設為單例
public class AccountDaoImpl2 implements AccountDao {
// @Value(value = "com.mysql.jdbc.Driver") 直接賦值
@Value(value = "${jdbc.driver}") //條件:spring必須載入過第三方的jdbc.properties檔案
private String driver;
//@Value(value = "jdbc:mysql:///day02_spring")
@Value(value = "${jdbc.url}")
private String url;
//@Value(value = "root")
@Value(value = "${jdbc.username}")
private String username;
//@Value(value = "root")
@Value(value = "${jdbc.password}")
private String password;
}
2.5 spring提供的生命週期的註解
xml方式:
- Scope: 物件的作用域
- Destory-method :銷燬方法
- Init-method :初始化方法
註解的方式:
-
@Scope:物件的作用, 配置在類上
-
- Value屬性:(singleton | prototype)
-
@POSTConstruct:配置到方法上
-
- 配置初始化方式
-
@PreDestory:配置到方法上
-
- 配置銷燬方法
-
AccountDaoImpl2類下
//初始化的方法
@PostConstruct
public void start(){
System.out.println("這是初始化的方法");
}
//銷燬的方法
@PreDestroy
public void end(){
System.out.println("這是銷燬的方法");
}
三、spring的註解程式設計
純註解: 替換xml配置檔案。
- 條件:使用配置類替換xml配置檔案。
-
- 程式碼前端不在載入配置檔案, 而是載入配置類。
3.1 註解
- @Configuration: 宣告配置類
- @ComponentScan: 開啟包掃描
- PropertySource: 將properties零配置檔案交給spring容器管理。
3.2 步驟
3.2.1 測試類
- 載入配置類
- 獲取accountService物件,並放入容器中
public static void main(String[] args){
// 載入配置檔案---沒有---不能再用ClassPathXmlApplicationContext
// 配置類代替配置檔案---不在載入配置檔案了,要載入配置類---AnnotationConfigApplicationContext
//AnnotationConfigApplicationContext作用:載入配置類
ApplicationContext applicationContext=new AnnotationConfigApplicationContext(SpringConfig.class);
//問容器要service物件
AccountService accountService=(AccountService)applicationContext.getBean("accountService");
accountService.delete();
}
3.3 SpringConfig配置類
@Configuration //聲明當前類是一個配置類,還會自動呼叫類中所有方法
@ComponentScan(basePackages ="com")
//要把自己的資源用註解代替---開啟一個掃描器
//<context:component-scan base-package="cn.itcast"></context:component-scan>
//載入外部的第三方配置檔案 <context:property-placeholder location="classpath:jdbc.properties">
@PropertySource(value = "classpath:jdbc.properties")
@Import(value = JdbcConfig.class)//整合別的配置類
public class SpringConfig {
}
3.4 AccountServiceImpl類
- 根據配置類中開啟的掃描器,定位到此類
@Service(value = "accountService")
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
public void delete() {
//呼叫dao
accountDao.delete();
}
}
3.5 AccountDaoImpl 層
@Repository(value = "accountDao")
public class AccountDaoImpl implements AccountDao {
@Autowired //依賴注入
private JdbcTemplate jdbcTemplate;
public void delete() {
String sql= "delete from account ";
jdbcTemplate.update(sql);
}
3.3 @Bean
- @Bean : 配置到方法上,表明此方法的返回值交給spring容器管理
-
- 將第三方物件交給spring容器管理的時候使用@Bean
* @Bean
* 使用:需要配置到方法上,此方法需要返回值
* 含義:將此方法的返回值交給spring容器管理
* 流程:當程式啟動的時候(建立spring容器),掃描所有配置了@bean註解的方法,
* 執行相關方法得到返回值,將返回值存入spring容器
* name:唯一標識
*/
/**
* 建立dataSource
*/
@Bean(name="dataSource")
public DataSource getDataSource() {
DruidDataSource ds = new DruidDataSource();
ds.setUsername("root");
ds.setPassword("111111");
ds.setUrl("jdbc:mysql:///springdb");
ds.setDriverClassName("com.mysql.jdbc.Driver");
return ds;
}
四、 spring整合junit(單元測試的註解)
4.1 環境搭建的步驟
- 匯入SpringJunit的座標
- 通過註解指定誰去載入配置檔案
- 通過註解指定配置檔案的位置
- 記載成功,可以注入並測試
4.2 SpringJunit
-
匯入座標
-
- Junit:單元測試
-
- Spring-test:spring整合junit的支援包
-
@Runwith(SpringJunit4ClassRunner.class) : 宣告spring提供的單元測試環境
-
@ContextConfiguration : 宣告spring的配置資訊
-
- Locations:xml配置檔案
-
- Classes:配置類的位元組碼
// 載入配置檔案或者配置類 ioc容器中才會有個個物件
@RunWith(value = SpringJUnit4ClassRunner.class) //載入配置檔案或者是配置類
//@ContextConfiguration(locations = "classpath:bean.xml") //指向配置檔案的位置
@ContextConfiguration(classes = SpringConfig.class) //指向配置類
public class Demo2_springJunit {
@Autowired // ioc容器有物件
private AccountService accountService;
@Test //做刪除
public void t1(){
accountService.delete();
}
}