Skip to content

六、注解开发

一、Spring原始注解

Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xmI配置文件可以简化配置,提高开发效率。

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的销毁方法

二、注解入门

java
@Repository("userDao")			//dao层,使用@Repository注解
public class UserDaoImpl implements UserDao {

   //...
}
java
@Service("userService")			//service层,使用@Service注解
public class UserServiceImpl implements UserService {

	//...
}
java
@Service("userService")			//service层,使用@Service注解
public class UserServiceImpl implements UserService {

    @Autowired			       //按照数据类型从Spring容器中进行匹配		
    private UserDao userDao;

	//...
}
java
@Service("userService")			//service层,使用@Service注解
public class UserServiceImpl implements UserService {

    @Autowired			       //按照数据类型从Spring容器中进行匹配		
    @Qualifier("userDao")     	//按照id值从容器进行匹配,和@Autowired一起使用
    private UserDao userDao;
	
    //...
}
java
@Service("userService")			//service层,使用@Service注解
public class UserServiceImpl implements UserService {

    @Resource(name="userDao") 	//相当于@Autowired + @Qualifier
    private UserDao userDao;

	//...
}

提示

如果出现找不到注解@Resource,编译器爆红,引入以下坐标

xml
<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.2</version>
</dependency>

配置context命名空间

xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
">

    <context:component-scan base-package="com.hdq"/>

</beans>
java
@Service("userService")
public class UserServiceImpl implements UserService {

    @Value("胡二狗")
    private String username;
   
}
java
@Service("userService")
@Scope("singleton")
//@Scope("prototype")
public class UserServiceImpl implements UserService {
	//...
}
java
@Service("userService")
public class UserServiceImpl implements UserService {
	
	//...

    //在Spring容器创建后调用
    @PostConstruct
    public void init(){
        System.out.println("UserService实例被创建...");
    }
java
@Service("userService")
public class UserServiceImpl implements UserService {
	
	//...

    //在Spring容器销毁后调用
    @PreDestroy
    public void destroy(){
        System.out.println("UserService实例被销毁...");
    }

测试

java
//注解开发
@Test
public void test(){
    ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
	UserService userService = app.getBean(UserService.class);
	userService.save();
	app.close();
}

结果

UserService实例被创建...
胡二狗
save run ...
UserService实例被销毁...

三、Spring新注解

使用上面的注解还不能全部替代xml配置文件,还需要使用注解替代的配置如下:

  • 非自定义的Bean的配置:<bean>
  • 加载properties文件的配置:<context:property-placeholder>
  • 组件扫描的配置:<context:component-scan>
  • 引入其他文件:<import>
注解说明
@Configuration用于指定当前类是一个Spring 配置类,当创建容器时会从该类上加载注解
@Componentscan 用于指定 Spring 在初始化容器时要扫描的包
作用和在 Spring 的xml 配置文件中的<context:component-scanbase-package="com.hdq"/>一样
@Bean使用在方法上,标注将该方法的返回值存储到 Spring 容器中
@PropertySource用于加载.properties 文件中的配置
@Import用于导入其他配置类
java
//@Configuration:用于声明当前类是一个配置类,即它定义了一个或多个@Bean方法 
@Configuration
@ComponentScan("com.hdq")
@Import({DataSourceConfiguration.class})
public class SpringConfiguration {

}
java
@Configuration
//@ComponentScan:告诉Spring在何处查找@Component、@Service、@Repository、@Controller等注解的类
@ComponentScan("com.hdq")
@Import({DataSourceConfiguration.class})
public class SpringConfiguration {

}
java
@Configuration
@ComponentScan("com.hdq")
//@Import:用于导入其他配置类,允许你在一个配置类中组合多个@Configuration类
@Import({DataSourceConfiguration.class})
public class SpringConfiguration {

}
java
//@PropertySource:用于指定一个或多个属性文件的位置,Spring将加载这些文件, 并将它们作为属性源(PropertySource)添加到环境中
@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,并将其注册到Spring容器中,定义了一个名为"dataSource"的Bean
    @Bean("dataSource")
    public ComboPooledDataSource getDataSource() throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setDriverClass(driver);
        dataSource.setJdbcUrl(url);
        dataSource.setUser(username);
        dataSource.setPassword(password);
        System.out.println(dataSource);
        return dataSource;
    }
}

测试

java
ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class);
UserService userService = app.getBean(UserService.class);
userService.save();