• Spring(六)注解开发


    一、注解开发bean

    (1)Dao上添加注解

    1. @Component("bookDao")
    2. public class BookDaoImpl implements BookDao {
    3. @Override
    4. public void save() {
    5. System.out.println("book dao save...");
    6. }
    7. }
    注意 :@Component 注解不可以添加在接口上,因为接口是无法创建对象的。

    (2)Service上添加注解

    1. @Component
    2. public class BookServiceImpl implements BookService {
    3. private BookDao bookDao;
    4. @Override
    5. public void save() {
    6. System.out.println("book service save...");
    7. bookDao.save();
    8. }
    9. public void setBookDao(BookDao bookDao) {
    10. this.bookDao = bookDao;
    11. }
    12. }

    (3)配置Spring的注解包扫描

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xsi:schemaLocation="
    6. http://www.springframework.org/schema/beans
    7. http://www.springframework.org/schema/beans/spring-beans.xsd
    8. http://www.springframework.org/schema/context
    9. http://www.springframework.org/schema/context/spring-context.xsd
    10. ">
    11. <context:component-scan base-package="com.itheima"/>
    12. beans>

    (4)客户端类

    1. public class App {
    2. public static void main(String[] args) {
    3. ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    4. BookDao bookDao = (BookDao) ctx.getBean("bookDao");
    5. System.out.println(bookDao);
    6. BookService bookService = ctx.getBean(BookService.class);
    7. System.out.println(bookService);
    8. }
    9. }

     

     

    二、纯注解开发

    (1)创建一个配置类SpringConfig

    (2)在配置类上添加@Configuration注解,将其标识为一个配置类,替换applicationContext.xml

    (3)在配置类上添加包扫描注解@ComponentScan替换-scan base-package=""/>

    1. @Configuration
    2. //@ComponentScan("com.itheima")
    3. @ComponentScan({"com.itheima.service","com.itheima.dao"})
    4. public class SpringConfig {
    5. }

    (4)创建一个新的运行类 AppForAnnotation 并执行

    1. public class AppForAnnotation {
    2. public static void main(String[] args) {
    3. ApplicationContext ctx = new
    4. AnnotationConfigApplicationContext(SpringConfig.class);
    5. BookDao bookDao = (BookDao) ctx.getBean("bookDao");
    6. System.out.println(bookDao);
    7. BookService bookService = ctx.getBean(BookService.class);
    8. System.out.println(bookService);
    9. }
    10. }

    注意:

     

     

     

    三、注解开发bean作用范围与生命周期管理

    (1) 要想将  BookDaoImpl  变成非单例,只需要在其类上添加  @scope  注解
    (2) 在对应的方法上添加  @PostConstruct   和  @PreDestroy 注解即可标识哪个是初始化方法,哪个是销毁方法
    1. @Repository
    2. @Scope("prototype")
    3. public class BookDaoImpl implements BookDao {
    4. @Override
    5. public void save() {
    6. System.out.println("book dao save...");
    7. }
    8. @PostConstruct
    9. public void init() {
    10. System.out.println("init ...");
    11. }
    12. @PreDestroy
    13. public void destroy() {
    14. System.out.println("destroy ...");
    15. }
    16. }

     

    四、注解开发依赖注入

    1. 注解实现按照类型注入

    (1) 在  BookServiceImpl  类的  bookDao  属性上添加  @Autowired   注解
    1. @Service
    2. public class BookServiceImpl implements BookService {
    3. @Autowired
    4. private BookDao bookDao;
    5. @Override
    6. public void save() {
    7. System.out.println("book service save...");
    8. bookDao.save();
    9. }
    10. }
    注意:
    1️⃣ 自动装配基于反射设计创建对象并通过暴力反射为私有属性进行设值 ,所以此处无需提供  setter  方法
    2️⃣自动装配建议使用无参构造方法创建对象(默认),如果不提供对应构造方法,请提供唯一的构造方法
    (2)@Autowired  是按照类型注入,那么对应  BookDao 接口如果有多个实现类,比如添加 BookDaoImpl2
    1. @Repository("bookDao")
    2. public class BookDaoImpl implements BookDao {
    3. @Override
    4. public void save() {
    5. System.out.println("book dao save...");
    6. }
    7. }
    8. @Repository("bookDao2")
    9. public class BookDaoImpl2 implements BookDao {
    10. @Override
    11. public void save() {
    12. System.out.println("book dao save...2");
    13. }
    14. }
    注意:
    1️⃣@Autowired  默认按照类型自动装配,如果  IoC  容器中同类的  Bean  找到多个,就按照变量名和 Bean 的名称匹配。因为变量名叫  bookDao  而容器中也有一个  booDao ,所以可以成功注入。

    2. 注解实现按照名称注入

    (3)使用到 @Qualifier 来指定注入哪个名称的bean对象

    1. @Service
    2. public class BookServiceImpl implements BookService {
    3. @Autowired
    4. @Qualifier("bookDao")
    5. private BookDao bookDao;
    6. @Override
    7. public void save() {
    8. System.out.println("book service save...");
    9. bookDao.save();
    10. }
    11. }

    注意:

    1️⃣@Qualifier 注解后的值就是需要注入的 bean 的名称

    2️⃣@Qualifier不能独立使用,必须和@Autowired一起使用

    3. 简单数据类型注入

    (1)使用  @Value   注解
    1. @Repository("bookDao")
    2. public class BookDaoImpl implements BookDao {
    3. @Value("itheima")
    4. private String name;
    5. @Override
    6. public void save() {
    7. System.out.println("book dao save..."+name);
    8. }
    9. }
    注意数据格式要匹配,如将 "abc" 注入给 int 值,这样程序就会报错。

    4. 注解读取properties配置文件

    (1)resource 下准备 properties 文件

    (2)使用注解加载 properties 配置文件,在配置类上添加 @PropertySource 注解

    1. @Configuration
    2. @ComponentScan("com.itheima")
    3. //@PropertySource({"jdbc.properties","jdbc1.properties"})
    4. @PropertySource("jdbc.properties")
    5. public class SpringConfig {
    6. }

    (3)使用 @Value 读取配置文件中的内容

    1. @Repository("bookDao")
    2. public class BookDaoImpl implements BookDao {
    3. // @Value("itheima")
    4. @Value("${name}")
    5. private String name;
    6. @Override
    7. public void save() {
    8. System.out.println("book dao save..."+name);
    9. }
    10. }

  • 相关阅读:
    互联网控制报文协议ICMP(计算机网络)
    labview编程笔记之条件结构
    hive location更新&hive元数据表详解
    laravel-实践
    Oracle数据泵跨大版本迁移数据库
    js节流防抖函数
    c 查询v4l2 各种参数
    抖音热搜榜上榜操作策略
    基本数据结构
    【第49篇】Swin Transformer V2:扩展容量和分辨率
  • 原文地址:https://blog.csdn.net/yirenyuan/article/details/127697303