目次
I.はじめに
前の記事から続けて、初心者向けのWeb開発の簡単な要約(4つ)-Webアプリケーション開発のMVCは、IoCコンテナーの関連コンテンツを要約します。
IoCコンテナーは、Springフレームワークのコア機能です。コンテナを介してすべてのJavaBeanコンポーネントを管理し、コンポーネントのライフサイクル管理、構成とアセンブリ、AOPサポート、およびAOPに基づくステートメントトランザクションサービスを提供します。
2つのIoCコンテナとは
IoC(制御の反転)コンテナ
通常、Javaコンポーネントは、新しいインスタンスを使用してコンポーネント間の参照を実装します。コンポーネントの2つのインスタンスの両方に共有コンポーネントが含まれている場合、コンポーネントを共有することはできません。システムに多数のコンポーネントがある場合、コンポーネントのライフサイクルを維持するだけでなく、コンポーネント間の依存関係を維持する必要があります。これにより、システムが大幅に複雑になり、コンポーネントは次のようになります。これらの制御プロセスは完全に開発されており、人が自分で制御します。
IoCコンテナは、制御の権利を反転し、制御の権利をIoCコンテナに渡します。IoCコンテナは、コンポーネントの作成と構成を担当し、コンポーネントのライフサイクル管理を担当します。開発者は、次のことのみを行う必要があります。コンポーネントが構成の作成とコンポーネントの使用が分離されるように、アセンブリルールを定義します。また、コンポーネントの複数のインスタンスに共有コンポーネントがある場合は、複数回注入しなくても相互に共有できます。
SpringのIoCコンテナでは、すべてのコンポーネントはJavaBeanコンポーネントと呼ばれ、各コンポーネントはBeanです。
コンポーネントの構成ルールを定義するには、通常2つの方法があります。
- (1)XML
- (2)注釈
3つの例
簡単な例を通して、このJavaBeanコンポーネントが構成ルールをどのように定義するかを見てください。
1.XMLを介してルールを構成します
- 1.プロジェクトpom.xmlにSpring-Context依存関係を導入します
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
- 2.プロジェクトで使用する必要のあるJavaBeansを定義します
(1)RegisterServiceを定義します。入力した携帯電話番号とパスワードを使用してユーザーを登録し、登録が成功した後、成功した登録SMSをユーザーに送信します。
public class RegisterService {
private MessageService messageService;
public void setMessageService(MessageService service) {
this.messageService = service;
}
public User register(String phone, String password) {
User user = new User();
user.phone = phone;
user.password = password;
//随机生成一个用户名
user.name = "小刘";
//需要将该信息写入数据库
SqlDataBase sql = new SqlDataBase();
sql.insert(user);
//注册成功之后,给用户发送短息
if (messageService == null) {
System.err.println("还没有初始化MessageService");
return user;
}
messageService.sendRegisterSuccessMessage(phone);
return user;
}
}
(2)MessageServiceの定義:ユーザーの携帯電話にSMSを送信します(ロジックは省略)
public class MessageService {
/**
* 发送短信
*
* @param phone
*/
public void sendRegisterSuccessMessage(String phone) {
String message = "您已经成功注册该网站账户";
System.out.println(String.format("已经成功的向%s发送注册短信:%s", phone, message));
}
}
- 3.JavaBeansを構成するためのルールを定義します
(1)ソースディレクトリにapplication-context.xmlファイルを追加します
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="registerService" class="com.wj.spring.RegisterService">
<property name="messageService" ref="messageService"/>
</bean>
<bean id="messageService" class="com.wj.spring.MessageService">
</bean>
</beans>
idは、Beanの一意のIDです。MessageServiceの参照は、<property name = "messageService" ref = "messageService" />のメソッドを介してRegisterServiceに追加されます。実際、上記のXML構成の内容は次のようになります。次のJavaコード:
MessageService messageService = new MessageService();
RegisterService registerService = new RegisterService();
registerService.setMessageService(messageService);
- 4. XMLファイルを読み取って、IoCコンテナであるApplicationContextを取得します。
public class RegisterApplication {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("config/application-context.xml");
RegisterService service = context.getBean(RegisterService.class);
//RegisterService service = (RegisterService)context.getBean("registerService");
User user = service.register("12345678901", "123456");
System.out.println("注册之后的用户名为:" + user.name);
}
}
ClassPathXmlApplicationContextが渡されるときは、このapplication-context.xmlの相対パスです。このようにして、定義されたJavaBeanはcontext.getBean()を介して取得できます。実行中のプロジェクトは次のとおりです。
関連するコードがgithubにアップロードされています:https://github.com/wenjing-bonnie/build-spring.git:com / wj / springの下の対応するコード。
2.注釈を渡します
XMLファイルを使用すると、すべてのJavaBeanを1つずつ一覧表示でき、構成の挿入によって各JavaBeanの依存関係を直感的に理解できますが、欠点も明らかになります。この書き込み方法は非常に面倒であり、コンポーネントを1つずつ追加する必要があります。コンポーネントをXMLで追加します。したがって、このアノテーション方法があり、IoCコンテナがすべてのBeanを自動的にスキャンしてアセンブルできるようにします。
- 1.上記1と同じ
- 2.同じ定義は上記のJavaBeanと同じですが、@ ComponentアノテーションがJavaBeanに追加され、JavaBeanコンポーネントであることを示します。
(1)RegisterServiceを定義します
@Component
public class RegisterAnnotationService {
// @Autowired将指定类型的Bean直接注入到指定的字段
@Autowired
private MessageAnnotationService messageAnnotationService;
}
@Autowiredを介して、指定されたタイプのBeanを指定されたフィールドに直接注入します。もちろん、@ AutowiredはList <JavaBean>コレクションに注釈を付けることもできるため、同じタイプの追加のJavaBeanはすべて、IoCコンテナによってコレクションに自動的にアセンブルされます。JavaBeansがアセンブルされる順序を設定する場合は、@ Order(1)、@ Order(2)...を追加できます。
デフォルトでは、特定のフィールドが@Autowiredでマークされている場合、IoCコンテナが対応するJavaBeanを見つけられない場合、NoSuchBeanDefinitionExceptionがスローされるため、@ Autowired(required = false)を追加してこの例外を回避できます。
(2)MessageServiceを定義する
@Component
public class MessageAnnotationService {
}
上記の2つのアノテーションを追加することにより、JavaBeans間の構成ルールが完成します。
デフォルトでは、JavaBeanは@Componentとしてマークされ、IoCコンテナは自動的にシングルトンを作成します。つまり、JavaBeanはコンテナが初期化されるときに作成され、コンテナが破棄されると破棄されます。コンテナ操作全体で、getBean()はインスタンスを取得します。
実際、@ Scopeを使用してインスタンスのスコープをマークできます:@Scope(value = "singleton")または@Scope( "singleton")、値は4つのスコープに対応します
シングルトン:唯一のBeanインスタンスで、デフォルトはシングルトンです。つまり、getBean()が取得するのはインスタンスです。
プロトタイプ:コンテナが新しいインスタンスを返すたび。つまり、getBean()は新しいインスタンスを取得します。
リクエスト:Httpリクエストが行われるたびに新しいインスタンスが生成されます。これは、現在のリクエストでのみ有効です。
セッション:Httpリクエストが行われるたびに新しいインスタンスが生成されます。これは、現在のセッションでのみ有効です。
- 3.注釈を読んでIoCコンテナを取得します
@Configuration //用来标明是一个配置类,在创建AnnotationConfigApplicationContext,需要传入该类
@ComponentScan //用来告诉容器,自动扫描当前类所在的包以及子包,把所有标注为@Component的Bean都自动创建出来,并根据@Autowired进行装配
public class RegisterAnnotationApplication {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(RegisterAnnotationApplication.class);
RegisterAnnotationService service = context.getBean(RegisterAnnotationService.class);
//RegisterService service = (RegisterService)context.getBean("registerService");
User user = service.register("12345678901", "123456");
System.out.println("注册之后的用户名为:" + user.name);
}
}
XMLファイルを介した構成メソッドとは異なり、ApplicationContextを読み取るときは、クラスに@Configurationを追加して、それが構成クラスであることを示す必要があります(実際、@ Configurationは@Componentに置き換えることができます。つまり、このコンポーネントを区別することはできません特定の関数については、@ Componentを直接使用します。AnnotationConfigApplicationContextを作成するときは、このクラスを渡す必要があります。@ ComponentScanを追加して、現在のクラスが配置されているパッケージとサブパッケージを自動的にスキャンするようにコンテナーに指示します(注スコープがあること)、@ ComponentとしてマークされたすべてのBeanを配置すると、@ Autowiredに従って自動的に作成され、アセンブルされます。
プロジェクトを実行した結果は、上記と一致しています。関連するコードがgithubにアップロードされています:https://github.com/wenjing-bonnie/build-spring.git:com / wj / springannotationの下の対応するコード。
3.Springの他のいくつかの注釈
1.JavaBeanコンポーネントに関連するアノテーション
以前に印象的だった@Controller / @ RestController、@ Service、@ Respositoryなどの一部と同様に、これらはすべてJavaBeansに注釈を付けるために使用されますが、区別できない場合は、これは後でSpringMVCにいくつかの特別な関数を持つJavaBeanです。所属するコンポーネント。@ Componentを使用して直接注釈を付けます。
2.構成ファイル、リソースファイル、およびその他の関連ソリューションを読み取ります
- (1)「リソース」の下にあるいくつかの一般的なファイルを読む
IoCコンテナを使用すると、これらのファイルを簡単にインポートできます。これは、プログラムが読み取るのに便利であり、InputStreamを取得するための面倒なコードを大幅に節約します。Mavenプロジェクトでは、これらのファイルは多くの場合Resourcesディレクトリに配置されるため、SpringフレームワークはファイルのInputStreamを直接読み取るためのorg.springframework.core.io.Resourceを提供します。
@Value("readme.txt")
private Resource readmeTxt;
次に、プロジェクトで、readmeTxt.getInputStream()を介してtxtinputstreamを取得できます。
- (2)リソースの下にあるいくつかのキー/値構造ファイルを読み取ります
多くの場合、一部の構成ファイルはキー/値形式で保存されます。上記の方法を使用するのは便利ではないため、IoCコンテナーはより便利な読み取り方法も提供します。@PropertySourceアノテーションを追加することで、キーに応じて対応する値を直接取得できます。たとえば、次のような構成ファイルconfig /application.propertiesがあります。
application.ipaddress = 192.168.110.118
構成ファイルを読み取る必要があるコンポーネントに@PropertySource( "config / application.properties")を追加するだけで、対応する値をキーで取得できます。
@Configuration
@PropertySource("config/application.properties")
public class ApplicationConfig {
@Value("${application.ipaddress}")
public String ipAddress;
}
@Value( "$ {application.ipaddress}"):デフォルト値のない値です。デフォルト値を指定する場合は、@ Value( "$ {application.ipaddress:192.168.0.0}")です。
- (3)他のコンポーネントで構成ファイルの関連コンテンツを参照する
上記の例でも、他の場所のconfig / application.propertiesの構成アイテムを参照する場合は、@ Value( "#{bean.property}")によって、対応する構成アイテムを直接取得できます。BeanはApplicationConfigです。インスタンスapplicationConfigのipAddress属性値(このインスタンスをインポートする必要はありませんが、コンポーネント名の最初の文字は小文字です)がOtherAnnotationにインポートされます。
@Component
public class OtherAnnotation {
@Value("#{applicationConfig.ipAddress}")
public String ipAddress;
}
このアノテーションメソッドを使用すると、OtherAnnotationにconfig / application.propertiesを導入しなくても、ApplicationConfigで定義された構成アイテムを読み取ることができます。(2)とは異なり、(2)では@Value( "$ {key:defaultValue}")を使用して構成ファイルの値を読み取りますが、OtherAnnotationでは@Value( "#{bean .property}")Read ApplicationConfigで読み取られる構成アイテム。
JavaBeanライフサイクルの4つの監視
JavaBeanをIoCコンテナに追加する場合、コンテナがJavaBeanを初期化するときにメッセージをリッスンし、コンテナが閉じられるときにリソースをクリーンアップする必要がある場合があります。次に、JavaBeanで2つのメソッドのみを定義し、プロジェクトにjavax.annotation依存関係を導入し、javax.annotationの@PostContructと@PreDestroyを上記の2つのメソッドに追加できます。プロセスは次のとおりです。
(1)pom.xmlにjavax.annotation依存関係を追加します
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
(2)MessageAnnotationServiceで初期化と破棄を実行する必要があるメソッドに@PostContructと@PreDestroyを追加します
public class MessageAnnotationService {
@PostConstruct
public void init() {
System.out.println("MessageAnnotationService init");
}
@PreDestroy
public void destroy() {
System.out.println("MessageAnnotationService destroy");
}
}
このように、IoCコンテナが初期化されて破棄されると、対応するメソッド呼び出しが表示されます。
五数要約
1. Springのコア機能はIoCコンテナーであり、コンポーネントの作成とアセンブリを提供します。構成ルールを定義するだけで、IoCコンテナーはすべてのプロセスを自動的に完了します。
2.コンポーネント間の構成ルールは、XMLファイルと注釈の2つの方法で定義できます。
3.最後に、プロジェクトにBean構成ファイルが非常に多い理由を理解しました。
4. @Componentを使用してクラスにコンポーネントとして注釈を付けると、IoCコンテナーはコンポーネントの開始時にコンポーネントを自動的に初期化します。
5. @Scopeを使用して、コンポーネントインスタンスのスコープを指定できます。これは、シングルトンであるか、毎回新しいインスタンスであるかを示します。
6. ApplicationContextはIoCコンテナーであり、対応するコンポーネントインスタンスはgetBean()を介してApplicationContextから取得できます。
7.コンポーネントが初期化または破棄されたときに、javax.annotationを使用して何かを実行します。
8. Resourceを使用して、リソースの下にあるファイルのinputStreamを簡単に取得できます。
9.構成ファイルのキー/値は、@ PropertySourceから簡単に取得できます。
10.以前に少し印象に残った@Controller / @ RestController、@ Service、@ Respositoryなどは、実際にはいくつかのコンポーネントですが、特別な機能を持ついくつかのコンポーネントです。
毎日少し進歩して、さあ!!!次回は、Xiaobai(7)の初心者Web開発の簡単な要約を見ていきます-データベースHSQLDB