注解方式注入
通过注解的方式完成对java对象的创建,属性赋值
使用注解的步骤
- 添加maven依赖
- 在添加spring-context依赖时,会自动的添加spring-aop ,spring-beans …
<!--Spring 依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
2. 在类上添加注解
- 例如:
- @Component 普通对象
- @Service
- @Controller
- @Repository
@Component
public class Student{
private Integer id;
private String name;
}
- 在spring配置文件中添加组件扫描器的标签,说明这个注解在项目中的位置
<!--声明组件扫描器-->
<!--base-package:指定注解在你项目中的包名-->
<!--工作方式:spring会去扫描base-package指定的包 把包中和子包中所有的类全都扫描一遍,
找到类中的注解,按照注解中的功能创建或者赋值-->
<context:component-scan base-package="com.yixuexi.test"/>
- 使用注解创建对象,创建容器ApplicationContext
和之前的一样创建
ApplicationContext ac = new ClassPathApplicationContext("applicationContext.xml");
//使用注解创建的对象 id就是类名首字母小写
ac.getBean("student");
需要学习的注解
- @Component
- @Repositoy
- @Service
- @Controller
- @Value
- @Autowired
- @Resource
@Component
- 功能:创建对象,等同于xml中bean标签的功能
- 属性:@Component(value="对象id") value 也就是bean的id
value的值是唯一的
创建的对象在容器中只有一个
- 位置:在类的上面
- 注意事项:此种方式创建的对象 底层是反射机制调用的该类的无参构造。
@Component(value="myStudent")
等同于xml文件的
<bean id="myStudent" class="com.yixuexi.test.Student">
然后在主配置文件中 写组件扫描器
<context:component-scan base-package="com.yixuexi.test"/>
在实际开发中 一般不会使用@Component注解的value属性,由spring提供默认名称
默认的名称是首字母小写 Student ----> student (常用)
spring和@Component注解功能一致,创建对象的注解:
@Service 使用在业务层
- 放在service的实现类上面,表示创建service对象,做业务处理的,事务等
@Controller 使用在控制器上面 - 放在控制器上面,创建控制器对象,接口用户的提交的参数,Servlet…
@Repository 使用在持久层 - 放在dao的实现类上面,表示创建dao对象,dao对象是能直接访问数据库的
- 以上三个注解的使用语法和@Component的语法是一样的。
- 这三个注解是给项目的对象分层的。【@Repository 持久层 】【@Service业务层】 【@Controller 控制层】
- 基本功能一样,就是用的地方不一样,多一个角色
什么时候用@Component注解: 在不确定这个类是什么作用的时候,它既不是持久层,也不是业务层,也不是控制层,但是还是要创建对象的时候就用 @Component注解
扫描多个包的方式
在xml文件中添加组件扫描器扫描多个包的方式
第一种方式:
使用多次组件扫描器,指定不同的包
<context:component-scan base-package="com.yixuexi.dao"/>
<context:component-scan base-package="com.yixuexi.service"/>
<context:component-scan base-package="com.yixuexi.controller"/>
第二种方式:
使用分隔符( ; 或者 , )
<context:component-scan base-package="com.yixuexi.test;com.yixuexi.dao"/>
<context:component-scan base-package="com.yixuexi.test,com.yixuexi.dao"/>
第三种方式:
指定一个父包
<context:component-scan base-package="com"/>
扫描器的特点是用递归的方式扫描子包和以下的包..
不建议使用,项目启动时间长,效率低,会扫描到很多无用的包
下一篇更新:spring注解方式依赖注入