1.春のテスト:
Springをテストするには、構成ファイルgetBeanを手動で読み取る必要がありますが、Springには自動化されたテスト方法も用意されています。
1)springd-testの依存関係を導入します。このテストのパッケージは、導入したSpringフレームワークのパッケージバージョンと一致している必要があり、異なるバージョンでサポートされている最小のjunitバージョンも一貫していないことに注意してください。5.2.6を使用しています。最小のjunit4.12がサポートに必要です。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--引入web会将所有的spring相关依赖全部导入-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<!--引入Spring测试环境-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
</dependencies>
2)構成ファイルとアセンブリBeanを手動で読み取る代わりに、注釈の置換と自動アセンブリを使用します
2. jdbcTemplate:Springが提供するデータベースを操作するためのテンプレート(IoCを感じる)。
1)依存関係を導入します(Druid接続プールを使用)
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
2)ここではSpring管理を使用しているため、使用する必要のあるクラスを最初にSpringコンテナーに注入し、jdbcTemplateに使用する接続プールを構成する必要があります。
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="username" value="root"/>
<property name="password" value="zjm@?42393"/>
<property name="url" value="jdbc:mysql://localhost:3306/study_mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false"/>
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
ここで、xmlファイルでは、文字&を&amp;にエスケープする必要があることに注意してください。
3)テスト
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:beans.xml")
public class TestFirst {
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
public void testCreateBean(){
jdbcTemplate.execute("select * from t_user");
}
}
もちろん、今後の開発では引き続きMybatisをメインストリームとして使用します。ここでのデモンストレーションは、Spring統合開発環境を示すことです。
Java構成クラス構成で再試行してみましょう。
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
@Configuration
public class jdbcConfig {
@Bean
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUsername("root");
dataSource.setPassword("zjm@?42393");
dataSource.setUrl("jdbc:mysql://localhost:3306/study_mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
return dataSource;
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource){
return new JdbcTemplate(dataSource);
}
}
実際、@ Beanアノテーションとメソッド生成オブジェクトは<bean>タグを置き換え、属性の挿入は名前またはタイプに基づいています。
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
import java.util.Map;
public class TestJdbcConfig {
@Test
public void testConfigJava(){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(jdbcConfig.class);
JdbcTemplate jdbcTemplate = context.getBean(JdbcTemplate.class);
List<Map<String, Object>> maps = jdbcTemplate.queryForList("select * from t_user");
for (Map<String, Object> map : maps) {
System.out.println(map);
}
}
}
3.豆のライフサイクル
1)エンティティクラスを記述し、メソッドにプリントアウトを追加します
package com.zt.entity;
public class Student {
private String name;
private int age;
public Student() {
System.out.println("-----构造-----");
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("-----注入name-----");
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
System.out.println("-----注入age-----");
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public void init(){
System.out.println("-----初始化-----");
}
public void destory(){
System.out.println("-----销毁-----");
}
}
2)オブジェクトを構成ファイルに登録します
<bean id="student" class="com.zt.entity.Student" init-method="init" destroy-method="destory">
<property name="age" value="22"/>
<property name="name" value="zzt"/>
</bean>
3)メソッドテスト
@Test
public void testBean(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
System.out.println("-----获取对象前-----");
Student student = context.getBean("student", Student.class);
System.out.println(student);
context.close();
}
構成ファイルが読み取られて解析されるとき、Springはすでにオブジェクトを作成しており、コンテナーが破棄されると、コンテナー管理オブジェクトが破棄されることがわかります。セッターが挿入される順序は、構成ファイルで定義されている属性の順序に関連しています。Beanのライフサイクルは、構築-注入-初期化-使用-破壊です。
[注]:コンストラクターインジェクションを使用している場合、setterメソッドは実際には呼び出されません。
<bean id="student" class="com.zt.entity.Student" init-method="init" destroy-method="destory">
<constructor-arg name="age" value="22"/>
<constructor-arg name="name" value="zzt"/>
</bean>
4.Beanポストプロセッサ
Springは、初期化の前後にBeanでいくつかの操作を実行するのに役立つポストプロセッサーを提供します。
1)ポストプロセッサクラスを継承し、初期化の前後に2つのメソッドをオーバーライドします。
package com.zt.handlers;
import com.zt.entity.Student;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class BeanHandler implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("-----初始化前处理-----");
if( bean instanceof Student ){
Student student = (Student) bean;
if("zzt".equals( student.getName() )){
System.out.println("wife");
}else if("zjm".equals( student.getName() )){
System.out.println("husband");
}
}
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("-----初始化后处理-----");
return bean;
}
}
2)Springコンテナに登録します。このオブジェクトを使用する必要がないため、BeanIDなしでクラスを直接指定できます。
<bean id="student" class="com.zt.entity.Student" init-method="init" destroy-method="destory">
<property name="age" value="22"/>
<property name="name" value="zzt"/>
</bean>
<bean class="com.zt.handlers.BeanHandler"/>
3)テストコール
public class BeanLife {
@Test
public void testBean(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
System.out.println("-----获取对象前-----");
Student student = context.getBean("student", Student.class);
System.out.println(student);
context.close();
}
}
[注]:これはインターセプターに似ています。Springコンテナーに注入されると、すべてのBeanを自動的にインターセプトし、オーバーライドしたメソッドを呼び出します。
Beanの完全なライフサイクルは、構築-注入-初期化前-初期化-初期化後-使用-破棄です。