Spring纯注解开发 - 依赖注入、自动装配、注解方式加载properties文件、注解方式管理第三方bean、注解实现第三方bean的依赖注入
注解开发
- 一、依赖注入 - 自动装配
-
-
- 1、使用@Autowired注解开启自动装配,默认使用按类型装配
-
-
- 1)使用@Repository注解标注数据访问层
- 2)使用@Service注解标注业务逻辑层
-
- 2、使用@Qualifier 注解开启使用指定名称装配
- 3、使用@Value 注解装配简单类型
-
- 二、使用@PropertySource 注解加载properties文件
- 三、使用注解管理第三方bean
-
-
- 1、定义一个独立的配置类
- 2、将JdbcConfig 配置类加入核心配置
-
-
- 方式一:导入式 - 推荐使用
- 方式二:扫描式
-
-
- 四、使用注解实现第三方bean的依赖注入
- 五、XML配置 VS 注解配置
一、依赖注入 - 自动装配
- 在使用xml文件配置时,博主写了几篇关于依赖注入的文章,介绍了4种依赖注入,分别是setter注入、构造器注入、自动装配和集合注入,感兴趣的小伙伴可以进入 Spring文章专栏 查看。
- 在使用注解开发时,我们只需要掌握自动装配的方式就可以了,因为使用注解实现自动装配的方式非常的便捷,也恰好体现了Spring简化开发的特性。
1、使用@Autowired注解开启自动装配,默认使用按类型装配
1)使用@Repository注解标注数据访问层
@Repositorypublic class BeanDaoImpl implements BeanDao { public void save() { System.out.println("beanDao save..."); }}
2)使用@Service注解标注业务逻辑层
@Servicepublic class BeanServiceImpl implements BeanService { @Autowired private BeanDao beanDao;// public void setBeanDao(BeanDao beanDao) {// this.beanDao = beanDao;// } public void save() { System.out.println("bean service save..."); }}
- 只需在需要注入的成员变量上添加@Autowired注解即可,此时采用的是按类型装配。
- 不需要提供set方法,因为自动装配是基于反射思想来创建对象的,且通过暴力反射权限修饰为私有的属性。
- 自动装配默认使用无参构造方法。
如果你想使用名称装配bean对象,请接着往下看。
2、使用@Qualifier 注解开启使用指定名称装配
@Servicepublic class BeanServiceImpl implements BeanService { @Autowired @Qualifier("beanDao") private BeanDao beanDao; public void save() { System.out.println("bean service save..."); beanDao.save(); }}
- 首先需要记住,@Qualifier 注解是必须和@Autowired 注解配合使用的。
除了添加@Qualifier 注解使用名称装配外,@Repository 注解还需要指定名称。
@Repository("beanDao")public class BeanDaoImpl implements BeanDao { public void save() { System.out.println("beanDao save..."); }}
如果@Repository 注解没有指定名称,或者指定的名称与@Qualifier 注解指定的不一样,会报NoSuchBeanDefinitionException 异常。
引用类型数据通过@Autowired 注解注入,那简单类型如何注入呢?
3、使用@Value 注解装配简单类型
@Servicepublic class BeanServiceImpl implements BeanService { @Value("qdxorigin") private String name;}
- @Value 注解可以直接在括号中写入值,像上面所示。
- 也可以使用
@Value("${jdbc.username}")private String name;
通过" ${} "符号动态取出properties文件中的值,切记:${} 必须写在双引号里面。
二、使用@PropertySource 注解加载properties文件
@Configuration@ComponentScan({"dao","service"})@PropertySource("jdbc.properties")public class SpringConfig {}
- @PropertySource 注解只有使用一次,如果需要加载多个配置文件,使用{}配置
@PropertySource({"jdbc.properties","druid.properties"})
- @PropertySource 注解声明在自定义的配置类中,自定义配置类内容见文章 纯注解开发 。
- @PropertySource 注解不支持使用 * 号通配符,不能使用
@PropertySource("*.properties")
进行配置
三、使用注解管理第三方bean
1、定义一个独立的配置类
public class JdbcConfig { @Bean public DataSource dataSource(){ DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setDriverClassName("com.mysql.jdbc.Driver"); druidDataSource.setUrl("jdbc:mysql://localhost:3306/graduate"); druidDataSource.setUsername("root"); druidDataSource.setPassword("200226"); return druidDataSource; }}
- 定义方法以次来获得需要管理的bean对象。
- 在该方法中加上@Bean 注解 表示当前方法的返回值是一个对象。
- 博主在学习这部分内容时,感觉又回到了手撕代码的环节了,但是对于第三方的bean,我们只能自己手动实现,不能通过注解完成。
2、将JdbcConfig 配置类加入核心配置
通俗的说,就是让JdbcConfig 配置类起作用,有两种实现方式。
方式一:导入式 - 推荐使用
SpringConfig配置类作为整个Spring的配置类,在该配置类中使用@Import 注解导入JdbcConfig 配置类。
@Configuration@ComponentScan({"dao","service"})@Import(JdbcConfig.class)public class SpringConfig {}
- @Import 注解也是只能使用一次,如果需要导入多个配置类,需要使用数组的形式配置,如下所示。
@Import({JdbcConfig.class,DruidConfig.class})
方式二:扫描式
在JdbcConfig 类上加入@Configuration 注解,直接表明该类也是一个配置类。
@Configurationpublic class JdbcConfig { @Bean public DataSource dataSource(){ DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setDriverClassName("com.mysql.jdbc.Driver"); druidDataSource.setUrl("jdbc:mysql://localhost:3306/graduate"); druidDataSource.setUsername("root"); druidDataSource.setPassword("123456"); return druidDataSource; }}
然后通过扫描包的形式将该类加载进核心配置。
@Configuration@ComponentScan({"qdxorigin.config","qdxorigin.dao","qdxorigin.service"})public class SpringConfig {}
四、使用注解实现第三方bean的依赖注入
以创建DruidDataSource 对象为例。
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; @Bean public DataSource dataSource(BeanDao beanDao){ DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setDriverClassName(driver); druidDataSource.setUrl(url); druidDataSource.setUsername(username); druidDataSource.setPassword(password); beanDao.save(); return druidDataSource; }}
- 对于简单类型的依赖注入,将其定义为成员变量,然后使用@Value 注解赋值即可。
- 对于引用类型的依赖注入,直接将其写入方法形参中,在方法体中直接调用即可,容器会根据类型自动装配。
五、XML配置 VS 注解配置
- 总的来说,博主更喜欢使用注解进行开发,因为确实非常的简捷。
- 如果想要了解更多内容,可以进入博主主页,寻找专栏 Spring 查看,该栏里的内容是博主对Spring相关知识的总结。