【02】Spring笔记–注解
一、常用注解:
- 用于创建bean对象:
名称 | 作用 |
---|---|
@Component | 在其他组件上添加注解时 |
@Controller | 用于Controller 层 |
@Service | 用于 service层 |
@Repository | 用于 dao层 |
上面4个用法相同:
作用:把当前类对象存入IOC容器中
属性:value
:用于指定bean的id。不写的话,默认值为 当前类名首字母小写。
@Repository("userDao")
public class UserDaoImpl implements UserDao {
public void addUser() {
System.out.println("userDao....addUser()执行了...");
}
}
//service层下
Service("userService")
public class UserServiceImpl implements UserService {
....
}
- 用于注入类中的属性
- 基本类型的注入
- 其他bean类型注入
①:基本数据类型注入:
作用 | |
---|---|
@Value | 用于注入基本类型和String类型的数据 |
属性: | value:用于指定数据的值。 可以使用spring中spEL(也就是spring的el表达式) spEL的写法:${表达式} |
@Component("user")
public class User {
@Value("YangUU")
private String name;
@Value("12")
private Integer age;
....
}
②:其他bean类型注入:
作用 | |
---|---|
@Autowired | 自动按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功 , 如果ioc容器中没有任何bean的类型和要注入的变量类型匹配,则报错。 |
@Qualifier | 作用:在按照类中注入的基础之上再按照名称注入。它在给类成员注入时不能单独使用。但是在给方法参数注入可以单独使用 属性:value:用于指定注入bean的id。 |
@Resource | 作用:直接根据bean的id注入,可以独立使用 属性:name:用于指定注入bean的id。(name不可省略 |
@Service("userService")
public class UserServiceImpl implements UserService {
//只要容器中有唯一的一个bean对象类型(AccountDaoImpl,已注解@Repository)和要注入的变量类型(AccountDao)匹配,就可以注入成功
//@Autowired
@Resource(name ="userDao")
private UserDao userDao;
public void addUser() {
userDao.addUser();
}
...
}
- 用于改变作用范围:
和xml配置中的<scope>
标签一样的功能
作用 | |
---|---|
@Scope | 用于指定bean的作用范围 |
属性:value | 指定范围的取值。 常用取值:singleton(单例), prototype(多例) |
- 生命周期相关的:(了解
(和在bean标签中使用init-method
和destroy-method
的作用是一样的)
作用 | |
---|---|
PreDestroy | 用于指定销毁方法 |
PostConstruct | 用于指定初始化方法 |
@Service("userService")
//@Scope("prototype")
public class UserServiceImpl implements UserService {
//@Autowired
//@Qualifier("userDao1")
@Resource(name ="userDao1")
private UserDao userDao;
public void addUser() {
userDao.addUser();
}
@PostConstruct
public void init() {
System.out.println("init()方法执行了...");
}
@PreDestroy
public void destory() {
System.out.println("destory()方法执行了...");
}
}
注:只使用以上注解的话还需要配合使用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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!--
告知spring在创建容器时要扫描的包,配置所需要的标签不是在beans的约束中,而是一个名称为context名称空间和约束中
-->
<context:component-scan base-package="com"></context:component-scan>
</beans>
二、纯Java类配置:
不需要xml文件,只使用一个java类专门来配置IOC容器,使用的也是注解
名称 | 作用 |
---|---|
@Configuration | 指定当前类是一个配置类 |
@ComponentScan | 指定spring在创建容器时要扫描的包 |
@Bean | 用于把当前方法的返回值作为bean对象存入spring的ioc容器中 value:指定一个要扫描的包 basePackages:指定创建容器时要扫描的多个包。使用大括号{} |
@Import | 用于导入其他的配置类 value:用于指定其他配置类的字节码。 当我们使用Import的注解之后,有Import注解的类就父配置类,而导入的都是子配置类 |
@PropertySource | 用于指定properties文件的位置属性: value:指定文件的名称和路径。 关键字:cLasspath,表示类路径下 |
//主配置类:
//指定为配置类
@Configuration
//指定扫描包
@ComponentScan(value = "indi.xu")
//导入子配置类(数据库连接池
@Import(JdbcConfig.class)
//指定properties文件位置,然后使用Spring EL获取值填充属性
@PropertySource("classpath:jdbcConfig.properties")
public class SpringConfiguration {
}
//jdbc配置类
public class JdbcConfig {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
/**
* 创建一个QueryRunner对象
* 把当前方法的返回值(QueryRunner对象)作为bean对象存入spring的ioc
*/
@Bean(name="runner")
@Scope("prototype")
public QueryRunner createQueryRunner(@Qualifier("ds1") DataSource dataSource){
//当具有双数据库的时候,或者多种连接池切换时。
//可以在这里加上一个注解说明使用哪个数据库连接池
return new QueryRunner(dataSource);
}
/**
* 创建连接池对象
*/
@Bean(name = "ds1")
public DataSource createDataSource(){
ComboPooledDataSource ds = null;
try {
ds = new ComboPooledDataSource();
ds.setDriverClass(driver);
ds.setJdbcUrl(url);
ds.setUser(username);
ds.setPassword(password);
return ds;
} catch (PropertyVetoException e) {
e.printStackTrace();
}
return ds;
}
/**
* 创建连接池对象
*/
@Bean(name = "ds2")
public DataSource createDataSource2(){
ComboPooledDataSource ds = null;
try {
ds = new ComboPooledDataSource();
ds.setDriverClass(driver);
ds.setJdbcUrl("jdbc:mysql:///eesy02");
ds.setUser(username);
ds.setPassword(password);
return ds;
} catch (PropertyVetoException e) {
e.printStackTrace();
}
return ds;
}
}
三:spring的EL表达式:
格式:${key名称}
- 用户获取外部文件中指定key的值
- 可以出现在xml配置文件中,也可以出现在注解@Value中
- 获取properties中环境变量