java-spring纯注解开发

1、创建配置类

  • 替代配置文件
/**
 * <p>描述 : 配置信息,省去编写配置文件
 */
@Configuration
@ComponentScan("cn.tjhis")
public class SpringConfig {
}

image

2、实现类注解

@Repository
public class UserDaoImpl implements UserDao {
    @Override
    public void save() {
        System.out.println("保存数据");
    }
}

3、调用

public class Main {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        UserDao userDao = ctx.getBean(UserDao.class);
        System.out.println(userDao);
    }
}

image

Spring常用注入方式为三种:属性注入、构造注入、setter注入。

image

  • 基于属性注入的方式,违反单一职责原则
    因为现在的业务一般都会使用很多依赖, 但拥有太多的依赖通常意味着承担更多的责任,而这显然违背了单一职责原则.并且类和依 赖容器强耦合,不能在容器外使用。

  • 基于属性注入的方式,容易导致Spring 初始化失败
    初始化Spring 容器是,由于属性在被注入前就引用而导致npe(空指针),进而导致容器初始化失败。
    java 在初始化一个类的顺序为,静态变量和静态代码块 -> 实例变量或者初始化语句 -> 构造函数 然后才会执行Spring 注解 @AutoWried 自动装配依赖,所以在执行这个类的构造方法时,依赖属性还未被注入。

  • @AutoWried 是SpringBeans包下的,@Resource 是 Javax 提供的不依赖于Spring框架,可以方便替换Ioc容器框架。

  • @AutoWried 是ByType注入,当存在两个类型相同的对象时就会注入失败

  • 如果一定要使用 属性注入,可以用@Resource 替代 @AutoWried注解

  • @Resource 相当于 @AutoWried 注解,@Resource 默认按照 byName 注入。可以使用 @Qualifier指定Spring bean的name。

  • @Resource装配顺序:(默认为byName)

    • ①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
    • ②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
    • ③如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
    • ④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原
  • Lombok提供了一个注解@RequiredArgsConstructor, 可以方便我们快速进行构造注入

    • 必须声明的变量为final,成带有必需参数的构造函数。 必需的参数是最终字段和具有约束的字段
    • 基于构造方法为属性赋值,容器通过调用类的构造方法将其进行依赖注入
    • @RequiredArgsConstructor主要是对当前类中带有final 的属性进行属性注入。
@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {
    final UserDao dao;

    @Override
    public void save() {
        dao.save();
        System.out.println("Service 保存数据");
    }
}

image

简单类型注入

  • config引入配置文件
@Configuration
@ComponentScan("cn.tjhis")
@PropertySource({"classpath:druid.properties","classpath:other.properties"})
public class SpringConfig {
}
  • 使用
@Repository
public class UserDaoImpl implements UserDao {
    @Value("${jdbc.url}")
    private String url;

    @Override
    public void save() {
        System.out.println(url);
        System.out.println("dao 保存数据");
    }
}

image

posted @ 2023-03-04 19:33  his365  阅读(51)  评论(0编辑  收藏  举报