搜索
首页
笔记
案例
关于
课程列表
Spring
IOC
入门---新建Spring工程
容器接口与实现类
Bean管理(基于XML)
Bean管理(基于注解)
完全注解开发
AOP
AOP概述
AspectJ实现AOP
AOP的实现步骤---前置通知
其他通知的AOP实现
Spring集成Mybatis
Spring整合Mybatis
Spring事务
Spring事务管理
Spring中使用事务
Spring与Web
在Servlet中使用Spring框架
Spring5新功能
课程导航
计算机基础知识
C
Linux
linux常用软件
计算机网络
程序员修养
设计模式
工具
Git
composer
vim
IntelliJ IDEA
wireshark
laravel
Spring
SpringMVC
Maven
数据库
MySQL
Redis
MongoDB
JDBC
Mybatis
MyBatis-Plus
服务端编程
PHP
Java
shell script
JavaWeb
HTML / CSS
HTML
CSS
HTML5
CSS3
BOOTSTRAP
JavaScript
JavaScript
JQuery
layui
Bean管理(基于注解)
完全注解开发
## 注解与XML方式的对比 注解优点是: - 方便 - 直观 - 高效(代码少,没有配置文件的书写那么复杂)。 其弊端也显而易见:以硬编码的方式写入到 Java 代码中,修改是需要重新编译代码的。 XML 方式优点是: - 配置和代码是分离的 - 在 xml 中做修改,无需编译代码,只需重启服务器即可将新的配置加载。 xml 的缺点是:编写麻烦,效率低,大型项目过于复杂。 **有一种折中的方式,配置文件和注解配合使用,但感觉更加麻烦** ## 对象创建 ### @Bean @Bean注解对应xml配置的bean标签。 #### 使用步骤 使用@Bean标签注入bean的步骤如下: - 创建配置类,配置类上需加上@Configuration。它的含义是告诉spring,该类是配置类,作用是替代xml配置文件。 ```java @Configuration public class SpringConfig { } ``` - 编写bean类 ``` public class User { private Integer age; private String name; public User() { } public User(Integer age, String name) { this.age = age; this.name = name; } …… } ``` - 在配置类中编写返回bean对象的方法,返回值是bean对象。该方法需要加上@Bean注解。 ```java @Configuration public class SpringConfig { @Bean public User getUser () { return new User(30, "gwx"); } } ``` - 编写测试类 ```java AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class); User user = context.getBean("getUser", User.class); System.out.println(user); ``` 我们来解读下Bean注解,默认没有给该注解设置value属性,那么该bean的id即为方法名。返回值为该bean类型。 ```java // 定义beanId @Bean(value="user") ``` #### 创建配置类 ```java @Configuration //作为配置类,替代 xml 配置文件 @ComponentScan(basePackages = {"com.atguigu"}) public class SpringConfig { } ``` #### 编写测试 ```java //加载配置类 ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class); UserService userService = context.getBean("userService", UserService.class); System.out.println(userService); ``` ### @ComponentScan @ComponentScan对应xml配置的context:component-scan标签,用来指定包扫描器,扫描指定包下含@Component、@Controller、@Service、@Repository注解的类,将这些类加载至容器中。 ```java @Configuration @ComponentScan(value = "com.annotation") public class SpringConfig { …… } ``` @ComponentScan有两个属性用来过滤 * includeFilters * excludeFilters 另外,@ComponentScans注解可定义多个扫描器 ### @Scope、@Lazy @Scope注解对应配置文件xml中的Bean标签中的scope属性。常见有两种值: - singleton,表示是单实例对象(默认值) - prototype,表示是多实例对象 singleton 和 prototype 区别: - singleton 单实例,prototype 多实例 - 设置 scope 值是 singleton 时候,加载 spring 配置文件时候就会创建单实例对象。 设置 scope 值是 prototype 时候,不是在加载 spring 配置文件时候创建对象,在调用getBean 方法时候创建多实例对象 ``` @Bean(value = "user") @Scope(value = "prototype") public User getUser () { return new User(30, "gwx"); } ``` 那么想要单实例的同时也想要懒加载咋办,可以使用@Lazy注解。即使是单实例的Bean,加上@Lazy注解后,也变成懒加载。@Lazy注解对应配置文件xml中的Bean标签中的lazy-init属性。 ```java @Bean(value = "user") @Lazy() public User getUser () { System.out.println("new user"); return new User(30, "gwx"); } ``` ### @Import 如果有第三方的包,该包中的类都没有加@Controller等注解,那么如果使用@Bean来注入的话,会非常的麻烦。这种情况下,可使用@Import注解导入。 ```java public @interface Import { /** * {@link Configuration @Configuration}, {@link ImportSelector}, * {@link ImportBeanDefinitionRegistrar}, or regular component classes to import. */ Class>[] value(); } ``` #### 方法1:classes ```java @Configuration @ComponentScan(value = "com.annotation") @Import(value = {OrderController.class, OrderService.class}) public class SpringConfig { } ``` #### 方法2:ImportSelector ```java @Configuration @ComponentScan(value = "com.annotation") @Import(value = {OrderController.class, OrderService.class, MyImportSelector.class}) public class SpringConfig { } ``` ## 生命周期 Bean生命周期即Bean对象创建到销毁的过程。关于什么事Bean的生命周期,可参考[该文章](http://blog.1024phper.com/home/index/course/cate_id/57/course_id/640) ### initMethod、destoryMethod 我们可通过xml配置,设置init-method以及destory-method。 ```xml
``` 下面,来通过注解方式设置初始化方法以及销毁方法。 步骤如下: - 创建Bean类 ```java public class Car { public Car() { System.out.println("create a car"); } public void initMethod () { System.out.println("car init"); } public void destroyMethod () { System.out.println("car destroy"); } } ``` - 注解配置 ```java @Bean(initMethod = "initMethod", destroyMethod = "destroyMethod") public Car car () { return new Car(); } ``` - 测试 ```java AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class); context.getBean("car", Car.class); context.close(); ``` 显示内容如下: ``` create a car car init car destroy ``` ### InitializingBean和DisposableBean InitializingBean以及DisposableBean都是接口。 ```java public interface InitializingBean { void afterPropertiesSet() throws Exception; } ``` ```java public interface DisposableBean { void destroy() throws Exception; } ``` 我们来让bean实现这两个接口,看看会发生什么 ```java public class Car implements InitializingBean,DisposableBean { public Car() { System.out.println("create a car"); } public void initMethod () { System.out.println("car init"); } public void destroyMethod () { System.out.println("car destroy"); } public void destroy() throws Exception { System.out.println("DisposableBean"); } public void afterPropertiesSet() throws Exception { System.out.println("InitializingBean"); } } ``` 执行测试,结果如下 ``` create a car InitializingBean car init DisposableBean car destroy ``` ### BeanPostProcessor 暂略(重要) ## 属性赋值 ### @value @value注解能够基本数据类型的属性赋值。对应xml配置的Bean标签的子标签property。具体的见[Bean管理(基于注解)](http://blog.1024phper.com/home/index/course/cate_id/57/course_id/641) ### @PropertySource 该注解可加载外部配置文件,对应xml配置中的content:property-placeholder标签 ```xml
``` 下面来演示下,如何使用注解的方式引入外部配置文件中的属性值: - 创建配置文件 person.properties ``` person.name=James person.age=36 ``` - 使用@PropertySource引入外部配置文件 ```java @Configuration @ComponentScan(value = "com.annotation") @PropertySource("classpath:person.properties") public class SpringConfig { } ``` - 用@Value使用配置文件中的属性值 ```java @Component public class Person { @Value("${person.name}") private String name; @Value("${person.age}") private Integer age; public Person() { } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } } ``` - 测试 ```java AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class); Person person = context.getBean("person", Person.class); System.out.println(person); // Person{name='James', age=36} ``` ### 自动装配 关于自动装配见[Bean管理(基于注解)](http://blog.1024phper.com/home/index/course/cate_id/57/course_id/641)的2.2小节。
Bean管理(基于注解)
文章目录