注解方式注入

通过注解的方式完成对java对象的创建,属性赋值
使用注解的步骤
  1. 添加maven依赖
    - 在添加spring-context依赖时,会自动的添加spring-aop ,spring-beans …
<!--Spring 依赖-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.2.5.RELEASE</version>
</dependency>

如何对已存在的容器添加挂载 容器中如何添加组件_java


2. 在类上添加注解

  • 例如:
    - @Component 普通对象
    - @Service
    - @Controller
    - @Repository
@Component
public class Student{
	private Integer id;
	private String name;
}
  1. 在spring配置文件中添加组件扫描器的标签,说明这个注解在项目中的位置
<!--声明组件扫描器-->
<!--base-package:指定注解在你项目中的包名-->
<!--工作方式:spring会去扫描base-package指定的包 把包中和子包中所有的类全都扫描一遍,
	找到类中的注解,按照注解中的功能创建或者赋值-->
<context:component-scan base-package="com.yixuexi.test"/>
  1. 使用注解创建对象,创建容器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对象是能直接访问数据库的
  1. 以上三个注解的使用语法和@Component的语法是一样的。
  2. 这三个注解是给项目的对象分层的。【@Repository 持久层 】【@Service业务层】 【@Controller 控制层】
  3. 基本功能一样,就是用的地方不一样,多一个角色

什么时候用@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"/>
	扫描器的特点是用递归的方式扫描子包和以下的包..
	不建议使用,项目启动时间长,效率低,会扫描到很多无用的包