IOC/DI注解开发

本文详细介绍了Spring框架中的注解开发,包括使用@Component及其衍生注解定义Bean,@Configuration和@ComponentScan配置类,@Scope设置Bean作用域,@PostConstruct和@PreDestroy管理生命周期,以及@Autowired、@Qualifier和@Value实现依赖注入。此外,还讨论了如何使用@PropertySource读取配置文件和@Bean管理第三方库的bean。最后,提到了@Import引入外部配置类的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、注解开发定义Bean(@Component/@Controller/@Service/@Repository)

知识点1:@Component/@Controller/@Service/@Repository

2、纯注解开发中的配置类(@Configuration/@ComponentScan)

知识点2:@Configuration

知识点3:@ComponentScan

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

3.1、Bean的作用范围(@Scope)

知识点4:@Scope

3.2、Bean的生命周期 (@PostConstruct/@PreDestroy)

知识点5:@PostConstruct 

知识点6:@PreDestroy

4、注解开发依赖注入(自动装配)

4.1、注解实现按照类型注入(@Autowired)

4.2、注解实现按照名称注入(@Qualifier)

4.3、简单数据类型注入(@Value)

4.4、注解读取properties配置文件(@PropertySource)

知识点7:@Autowired

知识点8:@Qualifier

知识点9:@Value

知识点10:@propertySource

5、IOC/DI注解开发管理第三方bean

5.1、注解开发管理第三方bean(以druid为例)

知识点11:@Bean

5.2、引入外部配置类

知识点12:@Import

6、注解开发总结


Spring在3.0版已经支持纯注解开发,不再需要applicationContext.xml配置文件。创建一个springConfig的配置类。

1、注解开发定义Bean(@Component/@Controller/@Service/@Repository

在实现类上添加@Component注解(BookDaoImpl为例)

@Component
public class BookDaoImpl implements BookDao {
    public void save(){
        System.out.println("book dao save.....");
    }
}

注意:@Component注解不可以添加在接口上,因为接口是无法创建对象的

说明:

  • BookServiceImpl类没有起名称,所以在App中是按照类型来获取bean对象
  • @Component注解如果不起名称,会有一个默认值就是当前类名首字母小写,所以也可以按照名称获取
  • 对于@Component注解,还衍生出了其他三个注解@Controller@Service@Repository ,方便我们后期在编写类的时候能很好的区分出这个类是属于表现层业务层还是数据层的类。
知识点1:@Component/@Controller/@Service/@Repository

2、纯注解开发中的配置类(@Configuration/@ComponentScan

(1)表示该类为配置类(@Configuration)

在配置类上添加 @Configuration 注解,将其标识为一个配置类 , 替换 applicationContext.xml
@Configuration
public class SpringConfig {
}

(2)用注解代替代替包扫描配置

在配置类上添加包扫描注解 @ComponentScan 替换 <context:component - scan base - package=""/>
@Configuration
@ComponentScan("com.AT")
public class SpringConfig {
}
@ComponentScan 注解用于设定扫描路径,此注解只能添加一次,多个数据请用数组格式
@ComponentScan({com.AT.service","com.AT.dao"})
知识点2:@Configuration

知识点3:@ComponentScan

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

3.1、Bean的作用范围(@Scope)

想要bookDaoImpl变成非单例,只需要在其类上添加@scope注解

@Component
@Scope("prototype")
public class BookDaoImpl implements BookDao {
    public void save(){
        System.out.println("book dao save.....");
    }
}
知识点4:@Scope

3.2、Bean的生命周期 (@PostConstruct/@PreDestroy)
BookDaoImpl 中添加两个方法, init destroy ,方法名可以任意。然后在对应的方法上添加 @PostConstruct @PreDestroy 注解即可
@Repository
public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }

    @PostConstruct //在构造方法之后执行,替换 init-method
    public void init() {
        System.out.println("init ...");
    }

     @PreDestroy //在销毁方法之前执行,替换 destroy-method
     public void destroy() {
         System.out.println("destroy ...");
     }
 }
注意 :@PostConstruct @PreDestroy 注解如果找不到,需要导入下面的 jar
<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.2</version>
</dependency
知识点5:@PostConstruct 

知识点6:@PreDestroy

 小结:

4、注解开发依赖注入(自动装配)

4.1、注解实现按照类型注入(@Autowired)
BookServiceImpl 类的 bookDao 属性上添加 @Autowired 注解
@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookDao bookDao;

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

注意:

  • @Autowired可以写在属性上,也可也写在setter方法上,最简单的处理方式是写在属性上并将setter方法删除掉
  • 为什么setter方法可以删除呢?
    • 自动装配基于反射设计创建对象并通过暴力反射为私有属性进行设值
    • 普通反射只能获取public修饰的内容
    • 暴力反射除了获取public修饰的内容还可以获取private修改的内容
    • 所以此处无需提供setter方法
4.2、注解实现按照名称注入(@Qualifier)
当根据类型在容器中找到多个 bean, 注入参数的属性名又和容器中 bean的名称不一致,这个时候就需要使用到 @Qualifier 来指定注入哪个名称的 bean 对象。
@Service
public class BookServiceImpl implements BookService {
    @Autowired
    @Qualifier("bookDao1")
    private BookDao bookDao;
    
    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
}
注意 :@Qualifier 不能独立使用,必须和 @Autowired 一起使用
4.3、简单数据类型注入(@Value)
使用 @Value 注解,将值写入注解的参数中就行了
@Repository("bookDao")
public class BookDaoImpl implements BookDao {
    @Value("AT")
    private String name;
    public void save() {
        System.out.println("book dao save ..." + name);
    }
}
4.4、注解读取properties配置文件(@PropertySource)

步骤1:resources下准备properties文件

name=At

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

@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);
    }
}

注意:

  • 如果读取的properties配置文件有多个,可以使用@PropertySource的属性来指定多个
@PropertySource({"jdbc.properties","xxx.properties"})
  • @PropertySource注解属性中不支持使用通配符* ,运行会报错
@PropertySource({"*.properties"})
  • @PropertySource注解属性中可以把classpath:加上,代表从当前项目的根路径找文件
1 @PropertySource({"classpath:jdbc.properties"})
知识点7:@Autowired

知识点8:@Qualifier

知识点9:@Value

知识点10:@propertySource

5、IOC/DI注解开发管理第三方bean

我们就需要有一种更加灵活的方式来定义bean,这种方式不能在原始代码上面书写注

解,一样能定义bean,这就用到了一个全新的注解@Bean

5.1、注解开发管理第三方bean(以druid为例)

步骤1:导入相应的jar包

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.16</version>
</dependency>

步骤2:在配置类中添加一个方法

注意该方法的返回值就是要创建的Bean对象类型

@Configuration
public class SpringConfig {
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/spring_db");
        ds.setUsername("root");
        ds.setPassword("root");
        return ds;
    }
}

步骤3:在方法上添加@Bean注解

@Bean注解的作用是将方法的返回值制作为Spring管理的一个bean对象

@Configuration
public class SpringConfig {
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/spring_db");
        ds.setUsername("root");
        ds.setPassword("root");
        return ds;
    }
}
知识点11:@Bean

5.2、引入外部配置类

对于数据源的bean,我们新建一个JdbcConfig配置类,并把数据源配置到该类下

public class JdbcConfig {
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/spring_db");
        ds.setUsername("root");
        ds.setPassword("root");
        return ds;
    }
}

(1)使用包扫描引入,需要在JdbcConfig上加入@Configuration注解(在springConfig中使用@ComponentScan进行引入)

(2)使用@Import引入,不需要在JdbcConfig上加入@Configuration注解

在Spring配置类中引入

@Configuration
@Import({JdbcConfig.class})
public class SpringConfig {
}

注意:

  • 扫描注解可以移除
  • @Import参数需要的是一个数组,可以引入多个配置类。
  • @Import注解在配置类中只能写一次
知识点12:@Import

6、注解开发总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值