Springスタディノート-03Springテスト、JdbcTemplateエクスペリエンス、Beanライフサイクル、Beanポストプロセッサ

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&amp;useUnicode=true&amp;characterEncoding=utf8&amp;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の完全なライフサイクルは、構築-注入-初期化前-初期化-初期化後-使用-破棄です。

おすすめ

転載: blog.csdn.net/qq_39304630/article/details/112388144