Spring为了使用注解简化开发,并没有提供构造函数注入
、setter注入
对应的注解,只提供了自动装配的注解实现。
直接上代码:
1,添加一个配置类`SpringConfig
@Configuration
@ComponentScan("com.itheima")
//@PropertySource加载properties配置文件
@PropertySource({"jdbc.properties"})
public class SpringConfig {
}
其中,@PropertySource加载properties配置文件
2,resource下准备properties文件
注解读取properties配置文件
@Value
一般会被用在从properties配置文件中读取内容进行使用
jdbc.properties
name=itheima888
注意:
-
如果读取的properties配置文件有多个,可以使用
@PropertySource
的属性来指定多个@PropertySource({"jdbc.properties","xxx.properties"})
-
@PropertySource
注解属性中不支持使用通配符*
,运行会报错@PropertySource({"*.properties"})
-
@PropertySource
注解属性中可以把classpath:
加上,代表从当前项目的根路径找文件@PropertySource({"classpath:jdbc.properties"})
2,添加BookDao、BookDaoImpl、BookService、BookServiceImpl类
public interface BookDao {public void save();
}@Repository("bookDao")
public class BookDaoImpl implements BookDao {//@Value:注入简单类型(无需提供set方法)@Value("${name}")private String name;public void save() {System.out.println("book dao save ..." + name);}
}@Repository("bookDao2")
public class BookDaoImpl2 implements BookDao {public void save() {System.out.println("book dao save ...2");}
}public interface BookService {public void save();
}@Service
public class BookServiceImpl implements BookService {//@Autowired:注入引用类型,自动装配模式,默认按类型装配@Autowired//@Qualifier:自动装配bean时按bean名称装配@Qualifier("bookDao")private BookDao bookDao;public void save() {System.out.println("book service save ...");bookDao.save();}
}
其中:
- @Autowired可以写在属性上,也可也写在setter方法上,最简单的处理方式是
写在属性上并将setter方法删除掉
- @Value(“${name}”):注入简单类型(无需提供set方法)
- @Autowired:注入引用类型,自动装配模式,默认按类型装配;
如果IOC容器中同类的Bean找到多个,就按照变量名和Bean的名称匹配。 - @Qualifier(“bookDao”):
- 自动装配bean时按bean名称装配,@Qualifier注解后的值就是需要注入的bean的名称。
- 当根据类型在容器中找到多个bean,注入参数的属性名又和容器中bean的名称不一致,此时需要用到@Qualifier(“bookDao”)来指定注入哪个名称的bean对象。
- 如果不加Qualifier(“bookDao”),因为按照类型会找到多个bean对象,此时会按照
bookDao
名称去找,如果找不到,会报NoUniqueBeanDefinitionException
注意:@Qualifier不能独立使用,必须和@Autowired一起使用
3,编写运行类
public class App {public static void main(String[] args) {AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);BookService bookService = ctx.getBean(BookService.class);BookService bookService2 = ctx.getBean(BookServiceImpl.class);bookService.save();bookService2.save();}
}
上述两个获取bean 的方式都可以
4,运行结果
发现bookDao、 @Value(“${name}”)都注入了
大总结
知识点1:@Autowired
名称 | @Autowired |
---|---|
类型 | 属性注解 或 方法注解(了解) 或 方法形参注解(了解) |
位置 | 属性定义上方 或 标准set方法上方 或 类set方法上方 或 方法形参前面 |
作用 | 为引用类型属性设置值 |
属性 | required:true/false,定义该属性是否允许为null |
知识点2:@Qualifier
名称 | @Qualifier |
---|---|
类型 | 属性注解 或 方法注解(了解) |
位置 | 属性定义上方 或 标准set方法上方 或 类set方法上方 |
作用 | 为引用类型属性指定注入的beanId |
属性 | value(默认):设置注入的beanId |
知识点3:@Value
名称 | @Value |
---|---|
类型 | 属性注解 或 方法注解(了解) |
位置 | 属性定义上方 或 标准set方法上方 或 类set方法上方 |
作用 | 为 基本数据类型 或 字符串类型 属性设置值 |
属性 | value(默认):要注入的属性值 |
知识点4:@PropertySource
名称 | @PropertySource |
---|---|
类型 | 类注解 |
位置 | 类定义上方 |
作用 | 加载properties文件中的属性值 |
属性 | value(默认):设置加载的properties文件对应的文件名或文件名组成的数组 |
思考:
- 上述app中,BookService bookService = ctx.getBean(BookService.class) 获取bean是按照类型BookService获取,但是实际获取的是BookServiceImpl类型对象;因此写成BookService bookService2 = ctx.getBean(BookServiceImpl.class);也能获取到对象
- 如果再写一个类来实现BookService的话,BookService bookService = ctx.getBean(BookService.class)会找到两个bean对象,因此会报错:```
Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException:
No qualifying bean of type 'com.itheima.service.BookService' available:expected single matching bean but found 2: bookServiceImpl,bs2
- 可以使用BookService bookService3 = ctx.getBean(BookServiceImpl2.class)获取bean
- 也可以使用名称注解后,使用名称获取,但需要转型:BookService bookService4 = (BookService) ctx.getBean(“bs2”);
*或者BookService bookService5 = (BookServiceImpl2) ctx.getBean(“bs2”);
代码:BookServiceImpl2类
@Service("bs2")
public class BookServiceImpl2 implements BookService {//@Autowired:注入引用类型,自动装配模式,默认按类型装配@Autowired//@Qualifier:自动装配bean时按bean名称装配@Qualifier("bookDao")private BookDao bookDao;public void save() {System.out.println("book service33 save ...");bookDao.save();}
}
app应用类:
public class App {public static void main(String[] args) {AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);//BookService bookService = ctx.getBean(BookService.class);BookService bookService2 = ctx.getBean(BookServiceImpl.class);BookService bookService3 = ctx.getBean(BookServiceImpl2.class);BookService bookService4 = (BookService) ctx.getBean("bs2");BookService bookService5 = (BookServiceImpl2) ctx.getBean("bs2");//bookService.save();bookService2.save();bookService3.save();bookService4.save();bookService5.save();}
}
运行结果:
由此得出:个人感觉还是需要名称注解比较合适
[说明]:内容主要来源黑马程序员网上资源学习