注解配置
学习基于注解的ioc配置,注解与xml配置实现的功能都是一样的,都是降低程序间的耦合,只是形式不一样
@Component
@Component
把当前类对象存入spring容器中
属性 value用于指定唯一id,默认值是当前类名,首字母小写
当我们把注释好的对象放在spring容器中,还有一个最最最重要的事情。
告知spring在创建容器时要扫描包,配置所需要的标签不是在beans的约束中,而是一个名称为context名称空间和约束中
Controller 表现层
Service 业务层
Repository 持久层
以上三个注解于Component一模一样的,它们三个是Spring框架是Spring为我们提供明确的注解,使我们的三层对象更加清晰
用于注入数据
它们的作用就和在xml中配置文件中的bean标签中写的property标签的作用是一样 的
Autowired 作用 自动按照类型注入,只要容器中有唯一的一个bean对象类型和要
注入的变量类型匹配,就可以注入成功
如果ioc容器中没有任何bean类型和要注入的变量类型匹配,则报错
如果ioc容器有多个匹配的情况
用注解注入的时候,set方法就不是必须得了
qualifier
在按照类中注入的基础之上再按照名称注入,它给类成员注入时不能单独使用,但是给方法参数注入时可以
value指定注入bean的id value =
resource
相同于qualifier注解,但是他可以单独使用,直接按照bean的id注入 name=
小总结
以上三个注入都只能注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实现
另外,集合的注入只能通过xml实现
@Scope
相同于xml注入
分为多例单例
我们不想使用xml文件进行配置,有没有方法能代替这个xml里面的文件呢
答案是我们需要创建一个配置类
@Configuration
指定当前类是一个配置类
想把这些内容都存放到配置类中
@ComponentScans() 指定要扫描的包
value作为属性,与basePackage作用一样,都是指定用于创建容器要扫描的包
我们使用此注解等同于在xml中配置了
在这个配置类里面,我们需要创建我们所需要的对象
<bean id="runner" class="org.apache.commons.dbutils.QueryRunner" scope="prototype">
<!--注入数据源-->
<constructor-arg name="ds" ref="dataSource"></constructor-arg>
</bean>
但是,下面这个方法不会生成对象存入到Spring的容器中
那么有一个注解会让这个方法生成的对象直接存放到Spring的ioc容器中
就是 @Bean
bean 作用 用于把当前方法的返回值作为bean对象存入ioc的容器中
其属性 name:用于指定bean的id,默认值是当前方法的名称
key = 方法名称 value = 返回值
这样就完成了
细节
当我们用注解配置方法时,方法有参数时,Spring框架会自动从ioc容器中查找有没有可用的bean对象
查找的方式和Autowired注解的作用是一样的
我们原来都是在bean.xml中配置这个文件,然后通过Application获取顶级容器,在从容器中getBean 获取到bean对象
用到了另一实体类 注解
以前构造方法中是“bean.xml”
现在改成配置类
配置类加载配置类
如果一个配置类只想进行关于数据库的配置
就可以在另一个配置类中 引入这个配置类
有Import注解的类就是配置类,而导入的都是子配置类
@PropertySource
用于指定properties文件的位置
value 指定文件的名称
关键字 classpath 表示类路径
@Qualifier 补充
有两个数据源,用注解注释一下判断用哪个数据源
关于junit与spring
程序的入口是main方法
junit单元测试,没有main方法也能执行
该方法就会判断当前测试类哪些方法有@Test
junit就让有注解的方法执行
junit不知道我们是否采用了spring框架,所以也不会从ioc容器取出
所以测试方法就算有写了autowired注解,也无法注入
@Runwith()