Spring IOC 注解方式 依赖注入

待我称王封你为后i 2022-01-11 07:47 472阅读 0赞

前置技能:

Java、JDBC、Spring IOC快速入门

注解:

在快速入门里,我们已经学会了通过xml来配置依赖注入,其实在我们自己创建的类里,也可以通过注解这一更简便的方式来达到这样的效果。

Getting Started:

1、引入jar包

同上

2、创建demo需要的Service和Dao

同上

3、创建XML配置文件
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!--标签头都是固定的-->
  3. <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 https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
  4. <!--开启注解 就这一行内容-->
  5. <context:component-scan base-package="com.ariko"></context:component-scan>
  6. </beans>
4、在类文件中添加注解

注解有四种,功能一样,但开发中我们一般按照语意去使用:
@Component 注解其他
@Controller 注解控制层
@Service 注解服务层
@Repository 注解dao层
Dao接口

  1. //接口中无需注解
  2. public interface UserDao {
  3. void doSomething();
  4. }

Dao实现类

  1. import org.springframework.stereotype.Repository;
  2. //注解是加在实现类的
  3. @Repository
  4. public class UserDaoImpl implements UserDao {
  5. @Override
  6. public void doSomething() {
  7. System.out.println("我是Userdao的实现类!");
  8. }
  9. }

当Service中依赖注入UserDao时,会注入有@Repository注解的那个实现类。

也就是说:一个接口,只能有一个带注解的实现类。

5、阶段测试

Test

  1. public class Test {
  2. public static void main(String[] args) {
  3. //实例化核心对象
  4. ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
  5. //获取注入的dao
  6. UserDao dao=ac.getBean(UserDao.class);
  7. dao.doSomething();

运行结果
在这里插入图片描述

6、多层的依赖注入 注解

Servlet持有一个Service对象,Service的实现类对象持有一个Dao的实现类对象。
——这种多层的依赖注入,我们需要在依赖注入的属性上也做注解。

在上述代码的基础上,再加入一个Service类。

Service及其实现类

  1. //和dao一样,接口里不用写注解
  2. public interface UserService {
  3. void doSomething();
  4. }

依赖注入的属性需要声明set方法!

  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.stereotype.Service;
  3. //使用了注解
  4. @Service
  5. public class UserServiceImpl implements UserService {
  6. //这个属性依赖注入 使用了注解
  7. @Autowired
  8. private UserDao daoImpl;
  9. @Override
  10. public void doSomething() {
  11. System.out.println("我是User的servie");
  12. daoImpl.doSomething();
  13. }
  14. //依赖注入的属性需要set方法!
  15. public UserDao getDaoImpl() {
  16. return daoImpl;
  17. }
  18. public void setDaoImpl(UserDao daoImpl) {
  19. this.daoImpl = daoImpl;
  20. }
  21. }
7、完成 和 测试

Test

  1. public class Test {
  2. public static void main(String[] args) {
  3. //实例化核心类
  4. ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
  5. //获取注入的service对象
  6. UserService ser=ac.getBean(UserService.class);
  7. ser.doSomething();

运行结果
在这里插入图片描述
可以看到,service实现类和dao实现类的方法都运行了,如果没有使用 @Autowired 注解依赖注入的属性,这里调用dao的方法时,是会报空指针异常的。

*8、其他

@Resource 和 @Autowired
@Resource 默认按照形参名去查找bean进行注入,按照名称找不到,继续按照类型进行查找。
@Autowired 默认按照类型查找bean进行注入,若找不到,继续按照形参名进行查找。

单例 singleton和 多例 prototype
通过Scope注解选择,默认是单例

  1. @Repository
  2. @Scope(value="prototype")
  3. public class UserDaoImpl implements UserDao {
  4. @Override
  5. public void doSomething() {
  6. System.out.println("我是Userdao的实现类!");
  7. }
  8. }

发表评论

表情:
评论列表 (有 0 条评论,472人围观)

还没有评论,来说两句吧...

相关阅读