Spring注解开发
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.lang"/>
使用@Compont或@Repository标识UserDaoImpl需要Spring进行实例化。
//@Component("userDao") @Repository("userDao") public class UserDaoImpl implements UserDao { @Override public void save() { System.out.println("save running... ..."); } }
使用@Compont或@Service标识UserServiceImpl需要Spring进行实例化
使用@Autowired或者@Autowired+@Qulifier或者@Resource进行userDao的注入
//@Component("userService") @Service("userService") public class UserServiceImpl implements UserService { /*@Autowired @Qualifier("userDao")*/ @Resource(name="userDao") private UserDao userDao; @Override public void save() { userDao.save(); } }
使用@Value进行字符串的注入
@Repository("userDao") public class UserDaoImpl implements UserDao { @Value("注入普通数据") private String str; @Value("${jdbc.driver}") private String driver; @Override public void save() { System.out.println(str); System.out.println(driver); System.out.println("save running... ..."); } }
使用@Scope标注Bean的范围
//@Scope("prototype") @Scope("singleton") public class UserDaoImpl implements UserDao { //此处省略代码 }
使用@PostConstruct标注初始化方法,使用@PreDestroy标注销毁方法
@PostConstruct public void init(){ System.out.println("初始化方法...."); } @PreDestroy public void destroy(){ System.out.println("销毁方法....."); }
2. Spring新注解(springboot中用到的多)
使用上面的注解还不能全部替代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 用于导入其他配置类 @Configurable
@ComponentScan
@Import
//标志该类是Spring的核心配置类 @Configurable //<context:component-scan base-package="com.lang"/> 组件扫描 @ComponentScan("com.lang") //<import resource=""/> 其他配置载入 @Import({DataSourceConfiguration.class})//多个时在{xx,xx} public class SpringConfiguration { }
@PropertySource
@Value
@Bean
//<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("dataSourse")//Spring会将当前方法的返回值以指定名称存储到Spring容器中 public DataSource getDataSource(){ DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(driver); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); return dataSource; } }
测试加载核心配置类创建Spring容器
public static void main(String[] args) throws SQLException { //ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class); UserService userService = (UserService) app.getBean("userService"); userService.save(); DataSource dataSource = (DataSource) app.getBean("dataSourse"); Connection con = dataSource.getConnection(); System.out.println(con); }