Spring-OCとDI注記の開発


1.Springカスタム以外のオブジェクトの構成
1.1構成方式
非カスタムオブジェクトと非カスタムオブジェクトは、Springにとってオブジェクトなので、構成方法に違いはありません.
下に、C 3 P 0データソース(C 3 P 0接続プール)を例に、Springの「非カスタムオブジェクト」の構成を示します
開発手順
①データソースの座標とデータベース駆動座標のインポート
②データソースオブジェクトの作成
③データソースの基本接続データの設定
④データソースによる接続リソースの取得と接続リソースの返却
1.2準備作業
1.2.1 c 3 p 0接続プール座標のインポート

<dependency>
    <groupId>c3p0groupId>
    <artifactId>c3p0artifactId>
    <version>0.9.1.2version>
dependency>

1.2.2 mysqlデータベース駆動座標のインポート

<dependency>
    <groupId>mysqlgroupId>
    <artifactId>mysql-connector-javaartifactId>
    <version>5.1.39version>
dependency>

1.3データソースの作成
1.3.1手動でC 3 P 0接続プールを作成する
@Test
public void testC3P0() throws Exception {
	//     
	ComboPooledDataSource dataSource = new ComboPooledDataSource();
	//         
    dataSource.setDriverClass("com.mysql.jdbc.Driver");
    dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
    dataSource.setUser("root");
    dataSource.setPassword("root");
	//      
	Connection connection = dataSource.getConnection();
	System.out.println(connection);
}

1.3.2 Spring C 3 P 0接続プールの構成
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="com.mysql.jdbc.Driver"/>
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/>
    <property name="user" value="root"/>
    <property name="password" value="root"/>
bean>

1.4スプリング構成の最適化(プロファイル抽出)
1.4.1 jdbcを抽出する.propertiesプロファイル
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root

1.4.2 Springのプロファイルにプロファイルを導入する
注:このセグメント構成では、Springに対応するネーミングスペース制約**context**を導入する必要があります.

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd 
            http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context.xsd">
      
    
    <context:property-placeholder location="classpath:jdbc.properties"/>
    
beans>

1.4.3 dataSourceの構成の変更
<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}"/>
bean>

Springコンテナのpropertiesファイルのロード
<context:property-placeholder location="xx.properties"/>
<property name="" value="${key}"/>

2.Spring注記開発
2.1概要Spring
Springは軽量コードで再構成されるフレームワークであり、構成が比較的重く、開発効率に影響するため、注釈開発はトレンドであり、xmlプロファイルの代わりに注釈を簡単に構成し、開発効率を高めることができる.
2.1 Spring元の注記
Spring元の注記は主に代替ラベルの構成です
2.1.1オブジェクトの注釈の作成
注釈
説明
@Component
クラスで使用するBeanのインスタンス化
@Controller
Webレイヤクラスで使用してBeanをインスタンス化
@Service
Beanをインスタンス化するためにserviceレイヤクラスで使用
@Repository
daoレイヤクラスで使用するBeanのインスタンス化
ケース:
@Repository("userDao")
public class UserDaoImpl implements UserDao {
    @Override
    public void save() {
    	System.out.println("save running... ...");
    }
}
//          ,    ,             ,     ,Dao     Repository


2.1.2注入依存注記
注釈
説明
@Autowired
タイプ依存注入に基づいて、複数が見つかった場合、変数名依存注入
@Qualifier
@Autowiredとともに使用され、名前に基づいて依存注入を行うために使用されます.
@Resource
@Autowired+@Qualifierに相当し、名前で注入
@Value
通常のプロパティを入力します.一般にpropertiesのkeyを取得し、メンバー変数に注入するために使用されます.
ケース:
@Autowiredを使用して参照タイプを入力
@Service("userService")
public class UserServiceImpl implements UserService {
    
    @Autowired		//        ,      ,      userDao    
    private UserDao userDao;
    
    @Override
    public void save() {       
   	  userDao.save();
    }
}


@Valueを使用した文字列の入力
@Repository("userDao")
public class UserDaoImpl implements UserDao {
    @Value("      ")	  //      
    private String str;
    @Value("${jdbc.driver}")  //           properties      ,   
    private String driver;
    
    @Override
    public void save() {
        System.out.println(str);
        System.out.println(driver);
    }
}


2.1.3作用範囲の注記
注釈
説明
@Scope
2つの値:prototype->マルチインスタンス、singleton->単一インスタンス(デフォルト)
ケース:
@Scope("singleton")
public class UserDaoImpl implements UserDao {
   //      
}


2.1.4その他の注記
注釈
説明
@PostConstruct
オブジェクトが作成されたときに実行される寸法付け方法
@PreDestroy
マークアップされたメソッドは、オブジェクトが破棄されたときに実行されます.
ケース:
@PostConstruct
public void init(){
	System.out.println("     ....           ....");
}
@PreDestroy
public void destroy(){
	System.out.println("    ....           ....");
}


2.1.4注意事項
Spring注記開発を使用する場合、アプリケーションContext.xmlでは、注釈構成を使用するクラス、フィールド、メソッドを識別するために、どのパケットとそのサブパケットの下のBeanがスキャンする必要があるかを指定するコンポーネントスキャンを構成します.

<context:component-scan base-package="com.itheima">context:component-scan>


3 Spring新規注記
3.1新しい注釈の概要
Springの新しい注釈とは、Springのプロファイルを完全に置き換えるためのものです.
3.2新しい注釈の構成
注釈
説明
@Configuration
現在のクラスがSpring構成クラスであることを指定します.コンテナを作成すると、そのクラスから注記がロードされます.
@ComponentScan
Springがコンテナを初期化するときにスキャンするパッケージを指定します.
@Bean
メソッドで、寸法を使用してメソッドの戻り値をSpringコンテナに格納します.
@PropertySource
ロードに使用します.propertiesファイルの構成
@Import
その他の構成クラスのインポート
3.2新しい注釈の詳細
3.2.1 @Configuration
クラスがSpringの構成クラスであることを示し、springの構成情報を格納します.
@Configuration	
public class SpringConfiguration {
    
}


3.2.2 @ComponentScan
Springがコンテナを初期化するときにスキャンするパッケージを指定します.
xml構成時のに相当
@Configuration
@ComponentScan("com.itheima")		
public class SpringConfiguration {
    
}


3.2.3 @Import
他の構成クラスのインポートに使用
xml構成時のに相当
@Configuration
@ComponentScan("com.itheima")
@Import({DataSourceConfiguration.class})
public class SpringConfiguration {
}


3.2.4 @PropertySource
propertiesプロファイル用
xml構成時のに相当
@PropertySource("classpath:jdbc.properties")
public class DataSourceConfiguration {
    @Value("${jdbc.driver}")
    private String driver;
    
    @Value("${jdbc.url}")
    private String url;
    
    @Value("${jdbc.username}")
    private String username;
    
    @Value("${jdbc.password}")
    private String password;
}


3.2.5 @Bean
メソッドを使用すると、Springは自動的にメソッドを実行し、メソッドが返されるオブジェクトをspringコンテナに格納します.
@Bean("dataSource")
public DataSource getDataSource() throws PropertyVetoException { 
    ComboPooledDataSource ds = new ComboPooledDataSource(); 
    ds.setDriverClass(driver);
    ds.setJdbcUrl(url);
    ds.setUser(username);
    ds.setPassword(password);
    return ds;
} 


3.2.5新しい注釈のテスト(構成クラス)
@Test
public void testAnnoConfiguration() throws Exception {
    //     SpringConfiguration.class,  Spring     
	ApplicationContext ac = 
        	new AnnotationConfigApplicationContext(SpringConfiguration.class);
    
    //  userService  
    UserService userService = (UserService)ac.getBean("userService");
    userService.save();
    
    //  dataSource  
    DataSource dataSource = (DataSource)ac.getBean("dataSource");
    Connection connection = dataSource.getConnection(); 
    System.out.println(connection);
}


3.Spring統合Junit
3.1概要
従来のコードでは,テストクラスでは依存注入を正常に使用できなかった.
テストクラスでも依存注入を使用できるようにするには、Spring統合Junitが必要です.
3.2 Spring統合Junit手順
①スプリング統合Junit座標のインポート
②元の運転期間を@Runwith注記で置き換える
③@ContextConfigurationを使用してプロファイルまたは構成クラスを指定する
④@Autowiredを使用してテスト対象を注入
⑤試験方法を作成して試験する
3.3 Spring統合Junitコード実装
①スプリング統合Junit座標のインポート

<dependency>
    <groupId>org.springframeworkgroupId>
    <artifactId>spring-testartifactId>
    <version>5.0.2.RELEASEversion>
dependency>
<dependency>
    <groupId>junitgroupId>
    <artifactId>junitartifactId>
    <version>4.12version>
    <scope>testscope>
dependency>


②元の運転期間を@Runwith注記で置き換える
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringJunitTest {
}


③@ContextConfigurationを使用してプロファイルまたは構成クラスを指定する
@RunWith(SpringJUnit4ClassRunner.class)
//  spring      
//@ContextConfiguration(value = {"classpath:applicationContext.xml"})
//  spring     
@ContextConfiguration(classes = {SpringConfiguration.class})
public class SpringJunitTest {
}


④@Autowiredを使用してテスト対象を注入
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {SpringConfiguration.class})
public class SpringJunitTest {
    @Autowired
    private UserService userService;
}


⑤試験方法を作成して試験する
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {SpringConfiguration.class})
public class SpringJunitTest {
    @Autowired
    private UserService userService;
    @Test
    public void testUserService(){
   	 userService.save();
    }
}