一、原始注解
Spring原始注解主要是替代<bean>的配置,前9个是常用的注解
注解 | 说明 |
---|---|
@Component | 使用在类上用于实例化Bean |
@Controller | 使用在web层类上用于实例化Bean |
@Service | 使用在service层类上用于实例化Bean |
@Repository | 使用在dao层类上用于实例化Bean |
@Autowired | 使用在字段上用于根据类型依赖注入 |
@Qualifier | 结合@Autowired一起使用根据名称进行依赖注入 |
@Resource | 相当于@Autowired+@Qualifier按照名称进行注入 |
@Value | 注入普通属性 |
@Scope | 标注Bean的作用范围 |
@PostConstruct | 使用在方法上标注该方法是Bean的初始化方法 |
@PreDestroy | 使用在方法上标注该方法是Bean的销毁方法 |
1、@Component:web层、dao层、service层等都可以用,这里以dao层举例,将名为“userDao”的Bean注入到spring容器中
//作用相当于在applicationContext.xml中配置<bean id="userDao" class="com.org.dao.impl.UserDaoImpl">
@Component("userDao")
public class UserDaoImpl implements UserDao {
public void save() {
System.out.println("save running...");
}
}
2、@Controller
//和@Component作用一样,但分类更具体
//实例化web层的Bean,这里不用指定名称
@Controller
public class UserController {
public String save(){
System.out.println("Controller save running...");
return "success.jsp";
}
}
3、@Service:将名为“userService”的Bean注入到spring容器中
//和@Component作用一样,但分类更具体
@Service("userService")
public class UserServiceImpl implements UserService {
public void save() {
System.out.println("success");
}
}
4、@Repository:将名为“userDao”的Bean注入到spring容器中
//和@Component作用一样,但分类更具体
@Repository("userDao")
public class UserDaoImpl implements UserDao {
public void save() {
System.out.println("save running...");
}
}
5、@Autowired:往userService中注入userDao这个Bean
@Service("userService")
public class UserServiceImpl implements UserService {
//相当于在applicationContext.xml中配置<property name="userDao" ref="userDao"></property>
@Autowired //按照数据类型从spring容器中进行匹配,当有多个userDao的bean时无法匹配到具体的,可以单独使用
private UserDao userDao;
public void save() {
userDao.save();
}
}
6、@Qualifier:和@Autowired搭配使用,往userService中注入userDao这个Bean
@Service("userService")
public class UserServiceImpl implements UserService {
//相当于在applicationContext.xml中配置<property name="userDao" ref="userDao"></property>
@Autowired
@Qualifier("userDao") //按照id值从容器中进行精确匹配,但是需要与Autowired一起使用
private UserDao userDao;
public void save() {
userDao.save();
}
}
7、@Resource:相当于@Autowired+@Qualifier的作用,写法更简单方便
@Service("userService")
public class UserServiceImpl implements UserService {
//相当于在applicationContext.xml中配置<property name="userDao" ref="userDao"></property>
@Resource(name = "userDao") //相当于@Autowired+@Qualifier
private UserDao userDao;
public void save() {
userDao.save();
}
}
8、@Value:可以完成普通数据类型的注入
@Service("userService")
public class UserServiceImpl implements UserService {
@Value("com.mysql.cj.jdbc.Driver") //普通数据类型的注入
private String driver;
public void save() {
System.out.println(driver); //输出为com.mysql.cj.jdbc.Driver
}
}
9、@Scope:若指定为singleton,容器中的Bean对象只有一个,不管new出多少个Bean,都是同一个;若指定为prototype,容器中的Bean对象可以有多个,每次new出来的都是不同的
@Service("userService")
@Scope("singleton") //or @Scope("prototype") 标注bean的作用范围,singleton表示单例(默认的),prototype表示多例
public class UserServiceImpl implements UserService {
@Value("com.mysql.cj.jdbc.Driver") //普通数据类型的注入
private String driver;
public void save() {
System.out.println(driver); //输出为com.mysql.cj.jdbc.Driver
}
}
10、@PostConstruct、@PreDestroy:对象的初始化方法和销毁方法注解
@PostConstruct //初始化方法注解
public void init(){
System.out.println("Service对象的初始化方法");
}
@PreDestroy //销毁方法注解
public void destory(){
System.out.println("Service对象的销毁方法");
}
二、新注解
Spring新注解主要是将applicationContext.xml里的一些配置简化为注解形式
注解 | 说明 |
@Configuration | 用于指定当前类是一个Spring配置类,当创建容器时会从该类上加载注解 |
@ComponentScan | 用于指定Spring在初始化容器时要扫描的包 |
@Bean | 使用在方法上,标注将该方法的返回值存储到Spring容器中 |
@PropertySource | 用于加载properties文件中的配置 |
@Import | 用于导入其他配置类 |
1、@Configuration:标志该类是Spring的核心配置类
//标志该类是Spring的核心配置类
@Configuration
public class SpringConfiguration {
}
2、@ComponentScan:指定要扫描的包
@Configuration
@ComponentScan("com.org") //组件扫描 相当于在xml中配置<context:component-scan base-package="com.org"/>
public class SpringConfiguration {
}
3、@PropertySource:
//加载properties文件
//相当于在xml中配置<context:property-placeholder location="classpath:jdbc.properties"/>
@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;
}
}
jdbc.properties文件配置如下:
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring-test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
jdbc.username=root
jdbc.password=
4、@Bean:被标注方法的返回值将以指定的名称存储到Spring容器中
//加载properties文件
//相当于在xml中配置<context:property-placeholder location="classpath:jdbc.properties"/>
@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;
@Bean("dataSource") //Spring会将当前方法的返回值以指定名称存储到Spring容器中
public ComboPooledDataSource getDataSource() throws PropertyVetoException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass(driver);
dataSource.setJdbcUrl(url);
dataSource.setUser(username);
dataSource.setPassword(password);
return dataSource;
}
}
5、@Import:以下代码表示在SpringConfiguration核心配置类中导入DataSourceConfiguration这个配置类
//标志该类是Spring的核心配置类
@Configuration
//import分模块配置文件 相当于在xml中配置<import resource=""/>
@Import({DataSourceConfiguration.class}) //{}里是个数组,如果需要导入多个配置文件,写法为{xx.class,xx.class}
public class SpringConfiguration {
}