1. public interface BookDao {
  2. void save();
  3. }
  1. @Repository
  2. @Scope("singleton") //singleton:单例 ; prototype:非单例
  3. public class BookDaoImpl implements BookDao {
  4. public void save(){
  5. System.out.println("book dao save...");
  6. }
  7. @PostConstruct //构造方法后
  8. public void init(){
  9. System.out.println("book dao init...");
  10. }
  11. @PreDestroy //在彻底销毁之前
  12. public void destroy(){
  13. System.out.println("book dao destroy...");
  14. }
  15. }
  1. package com.chentianyu.service;
  2. public interface BookService {
  3. }
  1. package com.chentianyu.service.impl;
  2. import com.chentianyu.Dao.BookDao;
  3. import com.chentianyu.service.BookService;
  4. import org.springframework.stereotype.Service;
  5. @Service
  6. public class BookServiceImpl implements BookService {
  7. private BookDao bookDao;
  8. public void setBookDao(BookDao bookDao){
  9. this.bookDao = bookDao;
  10. }
  11. public void save(){
  12. System.out.println("this service save ...");
  13. bookDao.save();
  14. }
  15. }
  1. public class App
  2. {
  3. public static void main( String[] args )
  4. {
  5. AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
  6. BookServiceImpl ctxBean = ctx.getBean(BookServiceImpl.class);
  7. ctxBean.save();
  8. ctx.close();
  9. }
  10. }

会出现问题:

  1. book dao init...
  2. this service save ...
  3. Exception in thread "main" java.lang.NullPointerException
  4. at com.chentianyu.service.impl.BookServiceImpl.save(BookServiceImpl.java:17)
  5. at com.chentianyu.App.main(App.java:18)

所以我们可以添加@Autowired

@Service
public class BookServiceImpl implements BookService {
    @Autowired //按类型装配
    private BookDao bookDao;

    public void setBookDao(BookDao bookDao){
        this.bookDao = bookDao;
    }

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

但是如果有俩个或以上的实现去自动装配

@Repository
@Scope("singleton") //singleton:单例 ; prototype:非单例
public class BookDaoImpl2 implements BookDao {

    public void save(){
        System.out.println("book dao save...2");
    }
/*    @PostConstruct //构造方法后
    public void init(){
        System.out.println("book dao init...");
    }
    @PreDestroy //在彻底销毁之前
    public void destroy(){
        System.out.println("book dao destroy...");
    }*/
}

你的类型变成了俩个都是BookDao类型的

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'bookServiceImpl': Unsatisfied

类型不唯一,这个问题按类型装配就不行了,拿名称装配

@Repository("bookDao")
@Scope("singleton") //singleton:单例 ; prototype:非单例
public class BookDaoImpl implements BookDao {

    public void save(){
        System.out.println("book dao save...");
    }
    @PostConstruct //构造方法后
    public void init(){
        System.out.println("book dao init...");
    }
    @PreDestroy //在彻底销毁之前
    public void destroy(){
        System.out.println("book dao destroy...");
    }
}
@Repository("bookDao2")
@Scope("singleton") //singleton:单例 ; prototype:非单例
public class BookDaoImpl2 implements BookDao {

    public void save(){
        System.out.println("book dao save...2");
    }
}

但是一般不这样

推荐的按名称注入

类型注入的时候有多个相同的bean
前面的名称还是要加上名称

@Autowired //按类型装配
@Qualifier("bookDao") //加上bean名称
private BookDao bookDao;
book dao init...
this service save ...
book dao save...
@Autowired //按类型装配
@Qualifier("bookDao2") //加上bean名称
private BookDao bookDao;
book dao init...
this service save ...
book dao save...2

注意: 自动装配基于反射设计创建对象并暴力反射对应私有属性初始化数据,因此无需提供setter方法
注意: 自动装配建议使用无参构造方法创建对象(默认),如果不提供对应的构造方法,请提供唯一的构造方法

  • 使用@Qualifier注解开启指定名称装配bean
  • 使用@Qualifiler注解无法单独使用,必须配合@Autowired注解使用
  • 使用@Value实现简单类型注入

    简单类型赋值

    @Value("2")
      private String two;
      public void save(){
          System.out.println("book dao save..."+two);
      }
    
    这样的写法我们可以导入外部的资源进入这个里面赋值
    name=chentianyu
    
    ```java @Configuration @ComponentScan(value = “com.chentianyu”) //@PropertySource(“one.properties”)//将文件导入进来,可以扫描到 @PropertySource({“one.properties”})//可以使用classpath:one.properties,但不允许出现.properties和classpath:one,properties public class SpringConfig {

}

```java
@Repository("bookDao2")
//@Scope("singleton") //singleton:单例 ; prototype:非单例
public class BookDaoImpl2 implements BookDao {

    @Value("${name}")
    private String two;
    public void save(){
        System.out.println("book dao save..."+two);
    }
/*    @PostConstruct //构造方法后
    public void init(){
        System.out.println("book dao init...");
    }
    @PreDestroy //在彻底销毁之前
    public void destroy(){
        System.out.println("book dao destroy...");
    }*/
}

输出结果:

book dao init...
this service save ...
book dao save...chentianyu
  • 使用@PropertySource注解加载properties文件
  • 注意: 路径仅支持单一文件配置,多文件请使用数组格式配置,不允许使用通配符*


小结

  • 自动配置
    • @Autowired
    • @Qualifiler
    • @Value
  • 读取properties文件
    • @PropertySource (不支持通配)