2.1 Spring原始注解
Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以简化配置,提高效率
Spring原始注解主要替代<Bean>的配置
注解 | 说明 |
@Component | 使用在类上用于实例化Bean |
@Controller | 使用web层类上用于实例化Bean |
@Service | 使用service层类上用于实例化Bean |
@Repository | 使用dao层类上用于实例化Bean |
@Autowired | 使用在字段上用于根据类型依赖注入 |
@Qualifier | 结合@Autowired一起使用用于根据名称进行依赖注入 |
@Resource | 相当于@Autowired+@Qualifier,按照名称进入注入 |
@Value | 注入普通属性 |
@Scope | 标注Bean的作用范围 |
@PostConstruct | 使用在方法上标注该方法是Bean的初始化方法 |
@PreDestroy | 使用在方法上标注该方法是Bean的销毁方法 |
注意:
使用注解进行开发时,需要applicationContext.xml中配置组件扫描,作用是指哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法
<!--配置组件扫描-->
<context:component-scan base-package="com.it"/>
原始注解案例
//定义一个接口(UserDao)
public interface UserDao {
public void save();
}
//实现类(UserDaolmpl)
//<bean id="userDao" class="com.it.dao.impl.UserDaolmpl"></bean>
//@Component("userDao")
@Repository("userDao")
public class UserDaolmpl implements UserDao {
public void save() {
System.out.println("save running");
}
}
//实现类(UserServicelmpl)
//<bean id="userService" class="com.it.service.impl.UserServicelmpl">
//@Component("userService")
@Service("userService")
@Scope("prototype")
public class UserServicelmpl implements UserService {
@Value("${jdbc.driver}")
private String driver;
// <property name="userDao" ref="userDao"></property>
//@Autowired //按照数据类型从spring容器中进行匹配的
//@Qualifier("userDao") //是按照id值从容器中进行匹配的 但是主要此处@Qualifier结合 @Autowired一起使用
@Resource(name = "userDao")
private UserDao userDao;
public void save() {
System.out.println(driver);
userDao.save();
}
@PostConstruct
public void init() {
System.out.println("Service对象的初始化方法");
}
@PreDestroy
public void destory() {
System.out.println("Service对象的销毁方法");
}
//测试类
public static void main(String[] args) {
ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = app.getBean(UserService.class);
userService.save();
app.close();
}
2.2 Spring新注解
使用上面注解还不能全部替代xml配置文件,需要使用注解替代的配置如下
- 非自定义的Bean的配置:<bean>
- 加载properties文件的配置:<context:property-placeholder>
- 组件扫描的配置:<context:component-scan>
- 引入其他文件:<import>
注解 说明 @Configuration 用于指定当前类是一个 Spring 配置类,当创建容器时会从该类上加载注解 @ComponentScan 用于指定 Spring 在初始化容器时要扫描的包。
作用和在Spring 的xml 配置文件中的
<context:component-scan base-package="com.itheima"/>-##
@Bean 使用在方法上,标注将该方法的返回值存储到Spring 容器 @PropertySource 用于加载.properties 文件中的配 @Import 用于导入其他配置 新注解案例
-
//实现类 //标志该类是Spring的核心配置类 @Configuration //<context:component-scan base-package="com.it"/> @ComponentScan("com.it") //<import resource=""/> @Import(DataSourceConfiguration.class) public class SpringCofiguration { } //实现类 //<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.passsword}") private String passsword; @Bean("dataSource") //Spring会将当前方法的返回值以指定名称存储到Spring容器中 public ComboPooledDataSource getDataSource() throws Exception { ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setDriverClass(driver); dataSource.setJdbcUrl(url); dataSource.setUser(username); dataSource.setPassword(passsword); return dataSource; } //测试类 public static void main(String[] args) { //ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); ApplicationContext app = new AnnotationConfigApplicationContext(SpringCofiguration.class); UserService userService = app.getBean(UserService.class); userService.save(); }