Day3 Spring IOC 注解

基于bean创建的

@Component

作用:指定类由Spring管理,相当于在xml中配置了一个bean;
属性:

  • value:指定 bean 的 id。如果不指定 value 属性,默认 bean 的 id 是当前类的类名(首字母小写)。

示例:

@Component
public class AccountService {
    void create() {
        System.out.println("创建账户成功。");
    }
}

// 测试类中:
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
                "com.bailiban.day3.spring_annotation.bean");
        AccountService service = (AccountService) context.getBean("accountService");
        service.create();
    }

运行结果:

创建账户成功。

@Controller...

  • @Controller:一般用于控制层;
  • @Service:一般用于业务层;
  • @Repository:一般用于持久层(数据库相关操作);

基于数据注入的

@Autowired

基于构造函数

用法:@Autowired用在构造函数上,Spring会根据构造函数的参数来注入。
示例:

@Service("accountService_constructor")
public class AccountService_Cons implements AccountService {

    private AccountDao accountDao;

    /**
     * 通过构造函数注入
     * @param accountDao
     */
    @Autowired
    public AccountService_Cons(AccountDao accountDao) {
        this.accountDao = accountDao;
    }

    public void create() {
        System.out.println(this.getClass().getAnnotation(Service.class).value());
        accountDao.create();
    }
}

测试:

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
                "com.bailiban.day3.spring_annotation.autowire");
        AccountService service = (AccountService) context.getBean("accountService_constructor");
        service.create();
    }

结果:

accountService_constructor
创建账户成功。
基于setter方法

用法:@Autowired用在setter方法上,Spring会根据setter方法来注入对于属性字段。
示例:

@Service("accountService_setter")
public class AccountService_Setter implements AccountService {
    private AccountDao accountDao;

    /**
     * 通过setter方法注入
     * @param accountDao
     */
    @Autowired
    public void setAccountDao(AccountDao accountDao) {
        this.accountDao = accountDao;
    }

    public void create() {
        System.out.println(this.getClass().getAnnotation(Service.class).value());
        accountDao.create();
    }
}

测试:

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
                "com.bailiban.day3.spring_annotation.autowire");
        AccountService service = (AccountService) context.getBean("accountService_setter");
        service.create();
    }

结果:

accountService_setter
创建账户成功。
基于字段

用法:@Autowired直接用于属性字段。
示例:

@Service("accountService_field")
public class AccountService_Field implements AccountService {

    // 通过属性注入
    @Autowired
    private AccountDao accountDao;

    public void create() {
        System.out.println(this.getClass().getAnnotation(Service.class).value());
        accountDao.create();
    }
}

测试:

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
                "com.bailiban.day3.spring_annotation.autowire");
        AccountService service = (AccountService) context.getBean("accountService_field");
        service.create();
    }

结果:

accountService_field
创建账户成功。

@Qualifier

用法:当Spring容器中有多个相同类型的实例对象时,必须指定要注入的是哪一个对象。可以使用@Qualifier来指定bean的名称。
示例:

@Component
public class Client {

    /**
     * 当Spring容器中有多个相同类型的实例对象时,必须指定要注入的是哪一个对象。可以使用@Qualifier来指定bean的名称。
     */
    @Autowired
    @Qualifier("accountService_setter")
    private AccountService accountService;

    public AccountService getAccountService() {
        return accountService;
    }

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
                "com.bailiban.day3.spring_annotation.autowire");
        Client client = (Client) context.getBean("client");
        client.getAccountService().create();
    }
}

运行结果:

accountService_setter
创建账户成功。

@Resource

用法:当Spring容器中有多个相同类型的实例对象时,必须指定要注入的是哪一个对象。@Qualifier需要配合@Autowired使用,也可以单独使用@ReSource注解。
示例:

@Component("client2")
public class Client {

    /**
     * 当有多个实例对象时,必须指定要注入的是哪一个对象
     * 注解@Resource可以替代 @Autowired + @Qualifier
     */
//    @Autowired
//    @Qualifier("accountService_setter")
    @Resource(name = "accountService_field")
    private AccountService accountService;

    public AccountService getAccountService() {
        return accountService;
    }

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
                "com.bailiban.day3.spring_annotation.autowire");
        Client client = (Client) context.getBean("client2");
        client.getAccountService().create();
    }
}

运行结果:

accountService_field
创建账户成功。

基于生命周期的

见bean生命周期:https://www.cnblogs.com/cheng18/p/12064425.html

配置相关的注解

@Configuration

指定当前类是一个Spring配置类。

@ComponentScan

指定 spring 在初始化容器时要扫描的包。

@Bean

该注解只能写在方法上,表明使用此方法创建一个对象,并且放入 spring 容器。

@PropertySource

用于加载.properties 文件中的配置。

示例:数据源配置

用于加载.properties 文件中的配置。

  1. jdbc.properties
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=123456
jdbc.driverClass=com.mysql.cj.jdbc.Driver
  1. DataSourceConfig配置类
@Configuration
@PropertySource("com/bailiban/day3/spring_annotation/config/jdbc.properties")
public class DataSourceConfig {

    // 从jdbc配置文件获取数据库连接属性
    @Value("${jdbc.jdbcUrl}")
    private String jdbcUrl;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;
    @Value("${jdbc.driverClass}")
    private String driverClass;

    @Bean("dataSource")
    public DataSource getDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(jdbcUrl);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setDriverClassName(driverClass);
        return dataSource;
    }
}

测试:

public class Client {

    public static void main(String[] args) throws Exception {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DataSourceConfig.class);
        DataSource dataSource = (DataSource) context.getBean("dataSource");
        Connection conn = dataSource.getConnection();
        System.out.println(conn);
        conn.close();
    }
}

运行结果:

信息: {dataSource-1} inited
com.mysql.cj.jdbc.ConnectionImpl@4b79ac84
posted @ 2019-12-20 00:03  cheng_18  阅读(318)  评论(0编辑  收藏  举报