如何解决Spring类中注入的问题?(一)

Spring为了使用注解简化开发,并没有提供构造函数注入、setter注入对应的注解,只提供了自动装配的注解实现。

1、环境准备

首先准备环境:

最终创建好的项目结构如下:

环境准备好后,运行后会发现有问题

出现问题的原因是,在BookServiceImpl类中添加了BookDao的属性,并提供了setter方法,但是目前是没有提供配置注入BookDao的,所以bookDao对象为Null,调用其save方法就会报空指针异常。

2、注解实现按照类型注入

对于这个问题使用注解该如何解决?

(1) 在BookServiceImpl类的bookDao属性上添加@Autowired注解

@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookDao bookDao;
​
//    @Autowired    
//    public void setBookDao(BookDao bookDao) {
//        this.bookDao = bookDao;
//    }
    public void save() {
        System.out.println("book service save ...");

        bookDao.save();
    }
}

注意:

(2)@Autowired是按照类型注入,那么对应BookDao接口如果有多个实现类,比如添加BookDaoImpl2

@Repository
public class BookDaoImpl2 implements BookDao {
    public void save() {
        System.out.println("book dao save ...2");
    }
}

这个时候再次运行App,就会报错

此时,按照类型注入就无法区分到底注入哪个对象,解决方案:按照名称注入

3、注解实现按照名称注入

当根据类型在容器中找到多个bean,注入参数的属性名又和容器中bean的名称不一致,这个时候该如何解决,就需要使用到@Qualifier来指定注入哪个名称的bean对象。

@Service
public class BookServiceImpl implements BookService {
    @Autowired
    @Qualifier("bookDao1")
    private BookDao bookDao;
    

图片[1]-如何解决Spring类中注入的问题?(一)-唐朝资源网

   public void save() {        System.out.println("book service save ...");        bookDao.save();   } }

@Qualifier注解后的值就是需要注入的bean的名称。

注意:@Qualifier不能独立使用,必须和@Autowired一起使用

4、简单数据类型注入

引用类型看完,简单类型注入就比较容易懂了。简单类型注入的是基本数据类型或者字符串类型,下面在BookDaoImpl类中添加一个name属性,用其进行简单类型注入

@Repository("bookDao")
public class BookDaoImpl implements BookDao {
    private String name;
    public void save() {
        System.out.println("book dao save ..." + name);
    }
}

数据类型换了,对应的注解也要跟着换,这次使用@Value注解,将值写入注解的参数中就行了

@Repository("bookDao")
public class BookDaoImpl implements BookDao {
    @Value("itheima")
    private String name;
    public void save() {

图片[2]-如何解决Spring类中注入的问题?(一)-唐朝资源网

       System.out.println("book dao save ..." + name);   } }

注意数据格式要匹配,如将”abc”注入给int值,这样程序就会报错。

介绍完后,会有一种感觉就是这个注解好像没什么用,跟直接赋值是一个效果,还没有直接赋值简单,所以这个注解存在的意义是什么?

5、注解读取properties配置文件

@Value一般会被用在从properties配置文件中读取内容进行使用,具体如何实现?

步骤1:resource下准备properties文件

jdbc.properties

name=itheima888

步骤2: 使用注解加载properties配置文件

在配置类上添加@PropertySource注解

@Configuration
@ComponentScan("com.itheima")
@PropertySource("jdbc.properties")
public class SpringConfig {
}
​

步骤3:使用@Value读取配置文件中的内容

@Repository("bookDao")
public class BookDaoImpl implements BookDao {
    @Value("${name}")

    private String name;
    public void save() {
        System.out.println("book dao save ..." + name);
    }
}

步骤4:运行程序

运行App类,查看运行结果,说明配置文件中的内容已经被加载到

注意:

知识点1:@Autowired名称@Autowired

类型

属性注解 或 方法注解(了解) 或 方法形参注解(了解)

位置

属性定义上方 或 标准set方法上方 或 类set方法上方 或 方法形参前面

作用

为引用类型属性设置值

属性

required:true/false,定义该属性是否允许为null

知识点2:@Qualifier名称@Qualifier

类型

属性注解 或 方法注解(了解)

位置

属性定义上方 或 标准set方法上方 或 类set方法上方

作用

为引用类型属性指定注入的beanId

属性

value(默认):设置注入的beanId

知识点3:@Value名称@Value

类型

属性注解 或 方法注解(了解)

位置

属性定义上方 或 标准set方法上方 或 类set方法上方

作用

为 基本数据类型 或 字符串类型 属性设置值

属性

value(默认):要注入的属性值

知识点4:@PropertySource名称@PropertySource

类型

类注解

位置

类定义上方

作用

加载properties文件中的属性值

属性

value(默认):设置加载的properties文件对应的文件名或文件名组成的数组

© 版权声明
THE END
喜欢就支持一下吧
点赞197赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容