第3章-第3节
一、知识点
将对象放入容器的四种注解和区别、获取对象的注解和区别、常用的一些配置注解
二、目标
-
掌握创建对象的四个注解和区别
-
掌握获取对象的注解
-
掌握@Bean注解的用法
-
理解@componentScan的作用
-
理解@Configuration的作用
三、内容分析
-
重点
-
掌握创建对象的四个注解和区别
-
掌握获取对象的注解
-
理解@componentScan的作用
-
-
难点
-
获取对象的注解
-
四、内容
1、创建对象的注解
1.1 @Component
作用:用于把当前类的对象存入spring容器中
属性:
value:用于指定bean的id,默认是当前类名,首字母小写
注意点:在xml中配置(配置扫描的路径)
com.mashang-> controller:接口的控制层,controller层关注接口请求方法、路径、传参、响应内容-> entity(model, domain):模型层/实体类-> mapper(dao):数据层,持久层,调用数据库以此来获取数据-> service:逻辑层,是用来执行一些接口的复杂逻辑的地方Javaweb -> 怎么做学生管理系统的?-> servlet层 -> 创建接口,并且执行业务的逻辑,操作数据库,把数据响应给前端-> utils层 工具类 JDBCUtil DateUtil RandomUtil-> entity层 Student Class ClassName-> filter层servlet层-> controller,专注于接口的路径、请求方法、请求参数,响应参数-> mapper,专注于操作数据库-> service,专注于接口的业务逻辑处理查询学生列表getStudentList()前端调用接口 -> controller -> service -> mapper -> service -> controller -> 响应给前端
<context:component-scan base-package="包名"></context:component-scan>
@Component
public class Test{}
1.2 @Controller
@Controller
public class StudentController{}
1.3 @Service
@Service
public class StudentService{}
1.4 @Repository
@Repository
public class StudentDao{}
public class StudentMapper{}
1.5 区别和注意点
-
这四个注解是一样的作用,使我们的架构更加清晰
-
一般我们的实体层不用注入对象
-
@component用于控制层(controller)、持久层(dao)、业务逻辑层(service)之外的类
2、注入对象的注解
2.1 @Autowired
作用:自动按照类型注入。当使用注解注入属性时,set方法可以省略。它只能注入其他bean类型。
@Repository
public class ClassDao1 extends ClassDao{}
@Repository
public class ClassDao2 extends ClassDao{}
@Autowired
private ClassDao classDao;
public void queryAll() {dao.queryAll();System.out.println(classDao);
}
2.2 @Qualifier
作用:在自动按照类型注入的基础上,再按照Bean的id注入。当有多个类型匹配时,使用要注入的对象变量名称作为bean的id,在spring中容器查找,找到了也可以注入成功,找不到就报错。它在给字段注入时不能独立使用,必须和@AutoWired一起使用。
属性:value,指定bean的id
@Autowired
@Qualifier("classDao1")
private ClassDao classDao;
public void queryAll() {dao.queryAll();System.out.println(classDao);
}
2.3 @Resource
作用:直接按照Bean的id注入
属性:name,指定Bean的id
以上的注解只能注入其他Bean类型,基本数据类型和String类型无法使用这些注解
@Resource(name = "studentDao1")
StudentDao dao;
2.4 @Value
作用:注入基本的数据类型和String类型
属性:value,用于指定值
@Value("王五")
private String name;
2.5 @Scope
作用:指定Bean的作用范围
属性:value,指定范围的值,取值(singleton prototype request session globalsession)
@Scope("prototype")
2.6 PostConstruct
作用:用于指定初始化方法,加上这个注解后,当对象生成后会自动调用对应的方法
@PostConstruct
public void init(){System.out.println("初始化了");
}
3、其他注解
3.1 @Configuration
作用:用于指定当前类是一个spring配置类,当创建容器时会从该类上加载注解。获取容器时需要使用
@Configuration // 指定当前类是一个配置类
@ComponentScan("com.company") // 指定要扫描的包
public class SpringConfig {}
ApplicationContext ctx =new AnnotationConfigApplicationContext(有@Configuration注解的类.class)
3.2 @ComponentScan
作用:用于指定spring在初始化容器要扫描的包,作用和spring的xml配置文件中<context:component-scan base-package="包名">一样
属性:basePackages:用于指定要扫描的包,和该注解的value属性一样
3.3 @Import
作用:用于导入其他配置类,在引入其他配置类时,可以不用再写@Configuration注解,当然,写上也可以
属性:value,用于指定其他配置类的字节码
// 可以写多个 使用,隔开
@Import(SpringConfig.class,xxx)
public class SpringConfig2 {}
3.4 @PropertySource
作用:用于加载.properties文件中的配置。例如我们配置数据源时,可以把连续数据库信息写到properties配置文件中,就可以使用此注解指定properties配置文件的位置
属性:value,用于指定properties文件位置,如果是在类路径下,需要写上classpath
@PropertySource("classpath:配置文件.properties")
获取配置中的值
3.4.1 @Value("$(配置文件中的Key)")
@Component
@PropertySource("classpath:druid.properties")
public class JDBCUtil {@Value("${driverClassName}")private String driverClassName;@Value("${username}")private String username;@Value("${password}")private String password;
public void getConnection(){System.out.println(driverClassName);System.out.println(username);System.out.println(password);}
}
JDBCUtil jdbcUtil = ctx.getBean(JDBCUtil.class);
jdbcUtil.getConnection();
maven导入mysql依赖包
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.19</version>
</dependency>
3.5 @Bean
作用:只能写在方法上,表明此方法创建一个对象,并且放入spring容器中
属性:name,给当前@Bean注解方法创建的对象指定一个名称(即Bean的id)。不写时,默认就是当前方法的名称。
// 这个是用来生成一个Connection对象的
// 我们可以把这个对象放到spring容器里面
@Bean
public Connection getConnection() {System.out.println(driverClassName);System.out.println(username);System.out.println(password);return null;
}
JDBCUtil jdbcUtil = ctx.getBean("方法名");
// 这个时候的Connection对象已经保存在容器中了
4、小结
本章节中我们学习了如何使用注解将对象放入容器中,如何使用注解将对象从容器中取出以及不同取出方式的区别,同时学习了其他在Spring中常用的注解,了解到了注解开发和XML配置的区别和优势,掌握了IOC的两种使用方式。
下一节中,我们将会学习反射和注解的相关知识点,深入探究IOC的两种方式是如何封装实现的,让我们对于框架的底层有更加深入的理解。