Anotaciones originales de primavera
anotación | Descripción |
---|---|
@Componente | Usado en la clase para instanciar Bean |
@Controlador | Usado en la clase para instanciar Bean (con semántica de capa web) |
@Servicio | Usado en la clase para instanciar Bean (con semántica de capa de servicio) |
@Repositorio | Usado en la clase para instanciar Bean (con semántica de capa dao) |
@Autowired | Inyectar tipos de referencia |
@Calificatorio | Inyectar tipos de referencia |
@Recurso | Inyectar tipos de referencia |
@Valor | Inyectar tipos básicos |
@Alcance | Configuración del alcance del bean |
@PostConstruct | Configuración del ciclo de vida del bean (llamado al inicializar) |
@Predestroy | Configuración del ciclo de vida del frijol (llamado cuando se destruye) |
Configurar el escaneo de componentes
El escaneo de componentes se configura en applicationContext.xml, que le dice a Spring que escanee las anotaciones debajo del paquete y sus subpaquetes
Nota: El análisis del componente de configuración debe realizarse en el espacio de nombres de contexto, así que no olvide agregar el espacio de nombres de contexto (y su ruta de restricción)
<!-- 配置组件扫描 -->
<context:component-scan base-package="service" />
<context:component-scan base-package="dao" />
@Component se usa para instanciar Bean
@Component("userDao")
public class UserDaoImpl implements UserDao {
public void sayHi() {
System.out.println("Hello!!!");
}
}
@ Controller / @ Service / @ Repository también se usa para instanciar Bean con semántica
@Repository("userDao")
public class UserDaoImpl implements UserDao {
public void sayHi() {
System.out.println("Hello!!!");
}
}
@Autowired inyecta automáticamente referencias basadas en el nombre de la clase (si la clase tiene varios beans en el contenedor de primavera, se informará un error)
@Component("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
public void sayHi() {
userDao.sayHi();
}
}
@ Autowired + @ Qualifier inyecta referencias de acuerdo con la identificación (dos juntas, no menos escritura)
@Component("userService")
public class UserServiceImpl implements UserService {
@Autowired
@Qualifier("userDao")
private UserDao userDao;
public void sayHi() {
userDao.sayHi();
}
}
@Resource inyecta referencias basadas en id (completamente equivalente a @ Autowired + @ Qualifier)
@Component("userService")
public class UserServiceImpl implements UserService {
@Resource(name = "userDao")
private UserDao userDao;
public void sayHi() {
userDao.sayHi();
}
}
@Value inyecta tipos de datos básicos (generalmente se usa junto con la sintaxis 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;
// ...
}
@ Alcance de la configuración del alcance (singleton singleton / prototype múltiples casos)
@Component("userDao")
@Scope("prototype")
public class UserDaoImpl implements UserDao {
// ...
}
@ PostConstruct / @ PreDestroy ciclo de vida de la configuración (método llamado automáticamente durante la inicialización / destrucción)
@Component("userDao")
public class UserDaoImpl implements UserDao {
@PostConstruct
public void init() {
System.out.println("初始化时调用我 >_<");
}
// ...
@PreDestroy
public void destroy() {
System.out.println("销毁时调用我 >_<");
}
}
Primavera de nuevas anotaciones
Las anotaciones clásicas anteriores no pueden reemplazar completamente el archivo de configuración xml. Por ejemplo, la siguiente situación:
- Beans no personalizados (Beans proporcionados directamente por terceros):
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">...</bean>
- Cargue el archivo de recursos:
<context:property-placeholder location="xxx.properties" />
- Configurar el escaneo de componentes:
<context:component-scan base-package="xxx" />
- Desarrollo de submódulos:
<import resource="applicationContext-xxx.xml" />
Usamos algunas ideas y diseños inteligentes para resolver los problemas anteriores:
- Ya no configure en applicationContext.xml, pero transfiera estas configuraciones a la clase config.SpringConfiguration.class
- La sintaxis SPEL se puede usar en applicationContext.xml, pero el código java en la clase config.SpringConfiguration.class obviamente no se puede usar. Podemos resolver este problema de manera ingeniosa: el código Java no puede usar SPEL, pero las anotaciones pueden usar SPEL; por lo tanto, la información del par clave-valor se puede inyectar en las variables miembro a través de anotaciones, y podemos usar esta información del par clave-valor indirectamente
- Al final, applicationContext.xml es completamente obsoleto y
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
reemplazado conApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class);
anotación | Descripción |
---|---|
@Configuración | Marque que esta es una clase de configuración de Spring |
@Frijol | El valor de retorno marcado se colocará directamente en el contenedor Spring |
@PropertySource | Se usa para cargar archivos de recursos |
@ComponenteScan | Se usa para configurar el escaneo de componentes |
@Importar | Para el desarrollo de submódulos |
@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;
}
}