春のオリジナルアノテーション
注釈 | 説明 |
---|---|
@成分 | Beanをインスタンス化するためにクラスで使用されます |
@コントローラ | Beanをインスタンス化するためにクラスで使用されます(Webレイヤーセマンティクスを使用) |
@サービス | Beanをインスタンス化するためにクラスで使用されます(サービスレイヤーセマンティクスを使用) |
@Repository | Beanをインスタンス化するためにクラスで使用されます(daoレイヤーセマンティクスを使用) |
@Autowired | 参照型を挿入します |
@Qualifier | 参照型を挿入します |
@資源 | 参照型を挿入します |
@値 | 基本タイプを注入する |
@範囲 | Beanスコープの構成 |
@PostConstruct | Beanライフサイクル構成(初期化時に呼び出されます) |
@PreDestroy | Beanのライフサイクル構成(破棄されたときに呼び出されます) |
コンポーネントスキャンを構成する
コンポーネントスキャンはapplicationContext.xmlで構成され、パッケージとそのサブパッケージの下の注釈をスキャンするようにSpringに指示します。
注:構成コンポーネントのスキャンは、コンテキスト名前空間で実行する必要があるため、コンテキスト名前空間(およびその制約パス)を追加することを忘れないでください。
<!-- 配置组件扫描 -->
<context:component-scan base-package="service" />
<context:component-scan base-package="dao" />
@ComponentはBeanをインスタンス化するために使用されます
@Component("userDao")
public class UserDaoImpl implements UserDao {
public void sayHi() {
System.out.println("Hello!!!");
}
}
@ Controller / @ Service / @ Repositoryは、セマンティクスを使用してBeanをインスタンス化するためにも使用されます
@Repository("userDao")
public class UserDaoImpl implements UserDao {
public void sayHi() {
System.out.println("Hello!!!");
}
}
@Autowiredは、クラス名に基づいて参照を自動的に挿入します(クラスのスプリングコンテナに複数のBeanがある場合、エラーが報告されます)
@Component("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
public void sayHi() {
userDao.sayHi();
}
}
@ Autowired + @ Qualifierは、IDに従って参照を挿入します(2つ一緒に、書き込みも少なくありません)
@Component("userService")
public class UserServiceImpl implements UserService {
@Autowired
@Qualifier("userDao")
private UserDao userDao;
public void sayHi() {
userDao.sayHi();
}
}
@Resourceは、IDに基づいて参照を挿入します(@ Autowired + @ Qualifierと完全に同等)
@Component("userService")
public class UserServiceImpl implements UserService {
@Resource(name = "userDao")
private UserDao userDao;
public void sayHi() {
userDao.sayHi();
}
}
@Valueは基本的なデータ型を挿入します(通常はSPEL構文と組み合わせて使用されます)
<!-- 在applicationContext.xml引入properties资源文件,就将这些键值对“倒入”了spring容器中 -->
<context:property-placeholder location="classpath:xxx.properties" />
@Component("userService")
public class UserServiceImpl implements UserService {
@Value("root")
private String username;
@Value("${password}")
private String password;
// ...
}
@Scope構成スコープ(シングルトンシングルトン/プロトタイプ複数ケース)
@Component("userDao")
@Scope("prototype")
public class UserDaoImpl implements UserDao {
// ...
}
@ PostConstruct / @ PreDestroy構成ライフサイクル(初期化/破棄中にメソッドが自動的に呼び出されます)
@Component("userDao")
public class UserDaoImpl implements UserDao {
@PostConstruct
public void init() {
System.out.println("初始化时调用我 >_<");
}
// ...
@PreDestroy
public void destroy() {
System.out.println("销毁时调用我 >_<");
}
}
春の新しい注釈
上記の従来のアノテーションでは、xml構成ファイルを完全に置き換えることはできません。たとえば、次の状況です。
- 非カスタムBean(サードパーティから直接提供されたBean):
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">...</bean>
- リソースファイルをロードします。
<context:property-placeholder location="xxx.properties" />
- コンポーネントスキャンを構成します。
<context:component-scan base-package="xxx" />
- サブモジュール開発:
<import resource="applicationContext-xxx.xml" />
上記の問題を解決するために、いくつかの巧妙なアイデアとデザインを使用しています。
- applicationContext.xmlで構成しなくなりましたが、これらの構成をconfig.SpringConfiguration.classクラスに転送します
- SPEL構文はapplicationContext.xmlで使用できますが、config.SpringConfiguration.classクラスのJavaコードは明らかに使用できません。この問題を巧妙に解決できます。JavaコードはSPELを使用できませんが、アノテーションはSPELを使用できます。したがって、キーと値のペアの情報をアノテーションを介してメンバー変数に挿入し、これらのキーと値のペアの情報を間接的に使用できます。
- 最終的に、applicationContext.xmlは完全に廃止され、次のように
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
置き換えられます。ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class);
注釈 | 説明 |
---|---|
@Configuration | これがSpring構成クラスであることをマークします |
@豆 | マークされた戻り値は、Springコンテナに直接配置されます |
@PropertySource | リソースファイルのロードに使用されます |
@ComponentScan | コンポーネントスキャンを構成するために使用されます |
@インポート | サブモジュール開発用 |
@Configuration // 表明这是一个配置类
@ComponentScan({
"dao", "service"}) // 配置组件扫描
@PropertySource("classpath:jdbc.properties") // 加载资源文件
@Import({
xxxConfiguration.class, xxxConfiguration.class}) // 分模块开发
public class SpringConfiguration {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean("dataSource")
public DataSource getDataSource() throws Exception {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass(driver);
dataSource.setJdbcUrl(url);
dataSource.setUser(username);
dataSource.setPassword(password);
return dataSource;
}
}