经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring » 查看文章
Spring注解驱动开发详解
来源:cnblogs  作者:许大仙  时间:2019/3/6 9:22:36  对本文有异议

1 组件注册

1.1 @Configuration&@Bean注册Bean

1.1.1 传统的xml方式

  • Person.java

  1. package com.xuweiwei.spring.model;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */public class Person {private String name;private Integer age;public Person() {
  5.     }public Person(String name, Integer age) {this.name = name;this.age = age;
  6.     }public String getName() {return name;
  7.     }public void setName(String name) {this.name = name;
  8.     }public Integer getAge() {return age;
  9.     }public void setAge(Integer age) {this.age = age;
  10.     }
  11.  
  12.     @Overridepublic String toString() {return "Person{" +
  13.                 "name='" + name + '\'' +
  14.                 ", age=" + age +
  15.                 '}';
  16.     }
  17. }
  • applicationContext.xml

  1. <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xmlns:context="http://www.springframework.org/schema/context"   xmlns:tx="http://www.springframework.org/schema/tx"   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  2.         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
  3.         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"><bean id="person" class="com.xuweiwei.spring.model.Person"><property name="name" value="许威威"/><property name="age" value="27"/></bean></beans>
  • 测试

  1. package com.xuweiwei.sping;import com.xuweiwei.spring.model.Person;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  2.  
  3. @RunWith(SpringJUnit4ClassRunner.class)
  4. @ContextConfiguration(locations = "classpath*:applicationContext.xml")public class SpringTest {
  5.     @Autowiredprivate Person person;
  6.  
  7.  
  8.     @Testpublic void test(){
  9.         System.out.println(person);
  10.     }
  11.  
  12. }

1.1.2 注解方式

  • Person.java

  1. package com.xuweiwei.spring.model;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */public class Person {private String name;private Integer age;public Person() {
  5.     }public Person(String name, Integer age) {this.name = name;this.age = age;
  6.     }public String getName() {return name;
  7.     }public void setName(String name) {this.name = name;
  8.     }public Integer getAge() {return age;
  9.     }public void setAge(Integer age) {this.age = age;
  10.     }
  11.  
  12.     @Overridepublic String toString() {return "Person{" +
  13.                 "name='" + name + '\'' +
  14.                 ", age=" + age +
  15.                 '}';
  16.     }
  17. }
  • MainConfig.java

  1. package com.xuweiwei.spring.config;import com.xuweiwei.spring.model.Person;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 *///配置类==配置文件//告诉Spring这是一个配置类@Configuration //相当于applicationContext.xmlpublic class MainConfig {/** * @Bean 注解相当于bean标签
  5.      *
  6.      * @return */@Beanpublic Person person() {return new Person("许威威", 27);
  7.     }
  8.  
  9. }
  • 测试

  1. package com.xuweiwei.sping;import com.xuweiwei.spring.config.MainConfig;import com.xuweiwei.spring.model.Person;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class ConfigurationSpringTest {
  2.  
  3.     @Testpublic void test() {
  4.         ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class);
  5.  
  6.         Person person = context.getBean(Person.class);
  7.         System.out.println(person);
  8.  
  9.         String[] names = context.getBeanDefinitionNames();for (String name : names) {
  10.             System.out.println(name);
  11.         }
  12.  
  13.     }
  14.  
  15. }

1.2 @ComponentScan自动扫描

1.2.1 传统的xml方式

  • PersonController.java

  1. package com.xuweiwei.spring.controller;import org.springframework.stereotype.Controller;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */@Controllerpublic class PersonController {
  5. }
  • PersonService.java

  1. package com.xuweiwei.spring.service;import org.springframework.stereotype.Service;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */@Servicepublic class PersonService {
  5. }
  • PersonDao.java

  1. package com.xuweiwei.spring.dao;import org.springframework.stereotype.Repository;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */@Repositorypublic class PersonDao {
  5. }
  • applicationContext.xml

  1. <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xmlns:context="http://www.springframework.org/schema/context"   xmlns:tx="http://www.springframework.org/schema/tx"   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  2.         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
  3.         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"><!--只要标注了@Controller、@Service、@Component、@Repository注解的都会自动注入到IOC容器中--><context:component-scan base-package="com.xuweiwei.spring"></context:component-scan></beans>
  • 测试

  1. package com.xuweiwei.sping;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.ApplicationContext;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  2.  
  3. @RunWith(SpringJUnit4ClassRunner.class)
  4. @ContextConfiguration(locations = "classpath*:applicationContext.xml")public class SpringTest {
  5.     @Autowiredprivate ApplicationContext context;
  6.  
  7.     @Testpublic void test(){
  8.         String[] names = context.getBeanDefinitionNames();for (String name : names) {
  9.             System.out.println(name);
  10.         }
  11.     }
  12. }

1.2.2 注解方式

  • Person.java

  1. package com.xuweiwei.spring.model;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */public class Person {private String name;private Integer age;public Person() {
  5.     }public Person(String name, Integer age) {this.name = name;this.age = age;
  6.     }public String getName() {return name;
  7.     }public void setName(String name) {this.name = name;
  8.     }public Integer getAge() {return age;
  9.     }public void setAge(Integer age) {this.age = age;
  10.     }
  11.  
  12.     @Overridepublic String toString() {return "Person{" +
  13.                 "name='" + name + '\'' +
  14.                 ", age=" + age +
  15.                 '}';
  16.     }
  17. }
  • PersonDao.java

  1. package com.xuweiwei.spring.dao;import org.springframework.stereotype.Repository;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */@Repositorypublic class PersonDao {
  5. }
  • PersonService.java

  1. package com.xuweiwei.spring.service;import org.springframework.stereotype.Service;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */@Servicepublic class PersonService {
  5. }
  • PersonController.java

  1. package com.xuweiwei.spring.controller;import org.springframework.stereotype.Controller;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */@Controllerpublic class PersonController {
  5. }
  • MainConfig.java

  1. package com.xuweiwei.spring.config;import com.xuweiwei.spring.model.Person;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 *///配置类==配置文件//告诉Spring这是一个配置类@Configuration //相当于applicationContext.xml@ComponentScan(value = "com.xuweiwei")public class MainConfig {/** * @Bean 注解相当于bean标签
  5.      *
  6.      * @return */@Beanpublic Person person() {return new Person("许威威", 27);
  7.     }
  8.  
  9. }
  • 测试

  1. package com.xuweiwei.sping;import com.xuweiwei.spring.config.MainConfig;import com.xuweiwei.spring.model.Person;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class ConfigurationSpringTest {
  2.  
  3.     @Testpublic void test() {
  4.         ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class);
  5.  
  6.         Person person = context.getBean(Person.class);
  7.         System.out.println(person);
  8.  
  9.         String[] names = context.getBeanDefinitionNames();for (String name : names) {
  10.             System.out.println(name);
  11.         }
  12.  
  13.     }
  14.  
  15. }
  • 如果是xml方式的只过滤Controller注解标注的类,代码如下

  1. <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xmlns:context="http://www.springframework.org/schema/context"   xmlns:tx="http://www.springframework.org/schema/tx"   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  2.         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
  3.         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"><!--只要标注了@Controller、@Service、@Component、@Repository注解的都会自动注入到IOC容器中,默认扫描全部--><context:component-scan base-package="com.xuweiwei.spring" use-default-filters="false"><context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan></beans>
  • 如果是注解方式只过滤Controller注解标注的类,代码如下

  1. package com.xuweiwei.spring.config;import com.xuweiwei.spring.model.Person;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.FilterType;import org.springframework.stereotype.Controller;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 *///配置类==配置文件//告诉Spring这是一个配置类@Configuration //相当于applicationContext.xml@ComponentScan(
  5.         value = "com.xuweiwei",
  6.         useDefaultFilters = false,
  7.         includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Controller.class)}
  8. )public class MainConfig {/** * @return * @Bean 注解相当于bean标签     */@Beanpublic Person person() {return new Person("许威威", 27);
  9.     }
  10.  
  11. }

1.3 @Scope注解

  • 设置组件的作用域。

  • 示例:

    • MainConfig.java  

  1. package com.xuweiwei.spring.config;import com.xuweiwei.spring.model.Person;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Scope;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 *///配置类==配置文件//告诉Spring这是一个配置类@Configuration //相当于applicationContext.xmlpublic class MainConfig {/** * * @see ConfigurableBeanFactory#SCOPE_PROTOTYPE
  5.      * * @see ConfigurableBeanFactory#SCOPE_SINGLETON
  6.      * * @see org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST
  7.      * * @see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION
  8.      * 默认情况下,是singleton
  9.      *
  10.      * singleton是单例
  11.      * prototype是多例
  12.      * request同一次请求创建一个实例
  13.      * session同一个Session创建一个实例
  14.      * @return */@Scope(value = "singleton")
  15.     @Beanpublic Person person() {return new Person("许威威", 27);
  16.     }
  17.  
  18. }

    • 测试  

  1. package com.xuweiwei.sping;import com.xuweiwei.spring.config.MainConfig;import com.xuweiwei.spring.model.Person;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class ConfigurationSpringTest {
  2.  
  3.     @Testpublic void test() {
  4.         ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class);
  5.  
  6.         Person person1 = context.getBean(Person.class);
  7.         Person person2 = context.getBean(Person.class);
  8.         System.out.println(person1 == person2);
  9.     }
  10.  
  11. }
  • 默认情况下,IOC容器启动会调用方法并创建对象放入到容器中,以后每次获取直接从容器中获取。

  • 如果scope的值是prototype,那么IOC容器启动的时候并不会调用方法,而是每次获取对象的时候创建对象并将对象放入到容器中。

1.4 @Lazy注解

  • @Lazy针对的是单实例的Bean。

  • 示例:

  1. package com.xuweiwei.spring.config;import com.xuweiwei.spring.model.Person;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Lazy;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 *///配置类==配置文件//告诉Spring这是一个配置类@Configuration //相当于applicationContext.xmlpublic class MainConfig {/** * 懒加载:容器启动的时候不创建对象,而是在第一次使用的时候,才创建对象
  5.      * @return */@Lazy
  6.     @Beanpublic Person person() {
  7.         System.out.println("给容器中注入Bean^_^ ^_^ ^_^ ^_^");return new Person("许威威", 27);
  8.     }
  9.  
  10. }

1.5 @Conditional注解

  • 根据条件给容器中注入Bean。【SpringBoot底层大量使用了这个注解】

  • 示例:

    • LinuxCondition.java  

  1. package com.xuweiwei.spring.condition;import org.springframework.context.annotation.Condition;import org.springframework.context.annotation.ConditionContext;import org.springframework.core.env.Environment;import org.springframework.core.type.AnnotatedTypeMetadata;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */public class LinuxCondition implements Condition {
  5.     @Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
  6.         Environment environment = context.getEnvironment();
  7.         String property = environment.getProperty("os.name");if(property.contains("linux")){return true;
  8.         }return false;
  9.     }
  10. }

    • WindowsCondition.java  

  1. package com.xuweiwei.spring.condition;import org.springframework.context.annotation.Condition;import org.springframework.context.annotation.ConditionContext;import org.springframework.core.env.Environment;import org.springframework.core.type.AnnotatedTypeMetadata;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */public class WindowsCondition implements Condition {
  5.     @Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
  6.         Environment environment = context.getEnvironment();
  7.         String property = environment.getProperty("os.name");if(property.contains("Windows")){return true;
  8.         }return false;
  9.     }
  10. }

    • MainConfig2.java  

  1. package com.xuweiwei.spring.config;import com.xuweiwei.spring.condition.LinuxCondition;import com.xuweiwei.spring.condition.WindowsCondition;import com.xuweiwei.spring.model.Person;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Conditional;import org.springframework.context.annotation.Configuration;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */@Configurationpublic class MainConfig2 {
  5.  
  6.     @Conditional(value = WindowsCondition.class)
  7.     @Bean("bill")public Person person1(){return new Person("比尔盖茨",60);
  8.     }
  9.  
  10.     @Conditional(value = LinuxCondition.class)
  11.     @Bean("linus")public Person person2(){return new Person("林纳斯",50);
  12.     }
  13.  
  14. }

    • 测试  

  1. package com.xuweiwei.sping;import com.xuweiwei.spring.config.MainConfig2;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class ConfigurationSpringTest {
  2.  
  3.     @Testpublic void test() {
  4.         ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig2.class);
  5.         String[] names = context.getBeanDefinitionNames();for (String name : names) {
  6.             System.out.println(name);
  7.         }
  8.     }
  9.  
  10. }
  • 【注】:如果@Conditional注解标注在类上,表示满足当前条件,这个类配置的所有Bean注册才能生效。

1.6 @Import注解

  • 给容器中快速导入一个组件。

  • ①@Import(要导入容器的组件):容器就会自动注册这个组件。

  • 示例:

    • Color.java  

  1. package com.xuweiwei.spring.model;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */public class Color {
  5. }

    • Person.java  

  1. package com.xuweiwei.spring.model;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */public class Person {private String name;private Integer age;public Person() {
  5.     }public Person(String name, Integer age) {this.name = name;this.age = age;
  6.     }public String getName() {return name;
  7.     }public void setName(String name) {this.name = name;
  8.     }public Integer getAge() {return age;
  9.     }public void setAge(Integer age) {this.age = age;
  10.     }
  11.  
  12.     @Overridepublic String toString() {return "Person{" +
  13.                 "name='" + name + '\'' +
  14.                 ", age=" + age +
  15.                 '}';
  16.     }
  17. }

    • MainConfig.java  

  1. package com.xuweiwei.spring.config;import com.xuweiwei.spring.model.Color;import com.xuweiwei.spring.model.Person;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Import;import org.springframework.context.annotation.Lazy;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 *///配置类==配置文件//告诉Spring这是一个配置类@Import(value = Color.class)
  5. @Configuration //相当于applicationContext.xmlpublic class MainConfig {/** * 懒加载:容器启动的时候不创建对象,而是在第一次使用的时候,才创建对象
  6.      * @return */@Lazy
  7.     @Beanpublic Person person() {
  8.         System.out.println("给容器中注入Bean^_^ ^_^ ^_^ ^_^");return new Person("许威威", 27);
  9.     }
  10.  
  11. }

    • 测试  

  1. package com.xuweiwei.sping;import com.xuweiwei.spring.config.MainConfig;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class ConfigurationSpringTest {
  2.  
  3.     @Testpublic void test() {
  4.         ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class);
  5.         String[] names = context.getBeanDefinitionNames();for (String name : names) {
  6.             System.out.println(name);
  7.         }
  8.     }
  9.  
  10. }
  • ②使用ImportSelector:返回需要导入组件的全类名数组。

  • 示例:

    • Color.java  

  1. package com.xuweiwei.spring.model;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */public class Color {
  5. }

    • Red.java  

  1. package com.xuweiwei.spring.model;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */public class Red {
  5. }

    • Blue.java  

  1. package com.xuweiwei.spring.model;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */public class Blue {
  5. }

    • Person.java  

  1. package com.xuweiwei.spring.model;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */public class Person {private String name;private Integer age;public Person() {
  5.     }public Person(String name, Integer age) {this.name = name;this.age = age;
  6.     }public String getName() {return name;
  7.     }public void setName(String name) {this.name = name;
  8.     }public Integer getAge() {return age;
  9.     }public void setAge(Integer age) {this.age = age;
  10.     }
  11.  
  12.     @Overridepublic String toString() {return "Person{" +
  13.                 "name='" + name + '\'' +
  14.                 ", age=" + age +
  15.                 '}';
  16.     }
  17. }

    • MyImportSelector.java

  1. package com.xuweiwei.spring.condition;import org.springframework.context.annotation.ImportSelector;import org.springframework.core.type.AnnotationMetadata;/**
  2.  * @describe: 自定义逻辑返回需要导入的组件
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */public class MyImportSelector implements ImportSelector {/** * 返回值就是要导入到容器中的组件全类名
  5.      * @param importingClassMetadata 当前标注@Import注解的类的所有注解信息
  6.      * @return */@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {return new String[]{"com.xuweiwei.spring.model.Blue","com.xuweiwei.spring.model.Red"};
  7.     }
  8. }

    • MainConfig.java  

  1. package com.xuweiwei.spring.config;import com.xuweiwei.spring.condition.MyImportSelector;import com.xuweiwei.spring.model.Color;import com.xuweiwei.spring.model.Person;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Import;import org.springframework.context.annotation.Lazy;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 *///配置类==配置文件//告诉Spring这是一个配置类@Import(value = {Color.class, MyImportSelector.class})
  5. @Configuration //相当于applicationContext.xmlpublic class MainConfig {/** * 懒加载:容器启动的时候不创建对象,而是在第一次使用的时候,才创建对象
  6.      * @return */@Lazy
  7.     @Beanpublic Person person() {
  8.         System.out.println("给容器中注入Bean^_^ ^_^ ^_^ ^_^");return new Person("许威威", 27);
  9.     }
  10.  
  11. }

    • 测试  

  1. package com.xuweiwei.sping;import com.xuweiwei.spring.config.MainConfig;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class ConfigurationSpringTest {
  2.  
  3.     @Testpublic void test() {
  4.         ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class);
  5.         String[] names = context.getBeanDefinitionNames();for (String name : names) {
  6.             System.out.println(name);
  7.         }
  8.     }
  9.  
  10. }
  • ③使用ImportBeanDefinitionRegistrar:可以手动注册指定名称的Bean。

  • 示例:

    • Blue.java  

  1. package com.xuweiwei.spring.model;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */public class Blue {
  5. }

    • Color.java  

  1. package com.xuweiwei.spring.model;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */public class Color {
  5. }

    • Person.java  

  1. package com.xuweiwei.spring.model;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */public class Person {private String name;private Integer age;public Person() {
  5.     }public Person(String name, Integer age) {this.name = name;this.age = age;
  6.     }public String getName() {return name;
  7.     }public void setName(String name) {this.name = name;
  8.     }public Integer getAge() {return age;
  9.     }public void setAge(Integer age) {this.age = age;
  10.     }
  11.  
  12.     @Overridepublic String toString() {return "Person{" +
  13.                 "name='" + name + '\'' +
  14.                 ", age=" + age +
  15.                 '}';
  16.     }
  17. }

    • Red.java  

  1. package com.xuweiwei.spring.model;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */public class Red {
  5. }

    • White.java  

  1. package com.xuweiwei.spring.model;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */public class White {
  5. }

    • MyImportBeanDefinitionRegistrar.java  

  1. package com.xuweiwei.spring.condition;import com.xuweiwei.spring.model.White;import org.springframework.beans.factory.support.BeanDefinitionRegistry;import org.springframework.beans.factory.support.RootBeanDefinition;import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;import org.springframework.core.type.AnnotationMetadata;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {/** * @param importingClassMetadata:当前标注@Import注解的类的所有注解信息
  5.      * @param registry:BeanDefinition注册类     */@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {boolean flag = registry.containsBeanDefinition("white");if (!flag) {
  6.             registry.registerBeanDefinition("white", new RootBeanDefinition(White.class));
  7.         }
  8.     }
  9. }

    • MainConfig.java

  1. package com.xuweiwei.spring.config;import com.xuweiwei.spring.condition.MyImportBeanDefinitionRegistrar;import com.xuweiwei.spring.condition.MyImportSelector;import com.xuweiwei.spring.model.Color;import com.xuweiwei.spring.model.Person;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Import;import org.springframework.context.annotation.Lazy;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 *///配置类==配置文件//告诉Spring这是一个配置类@Import(value = {Color.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
  5. @Configuration //相当于applicationContext.xmlpublic class MainConfig {/** * 懒加载:容器启动的时候不创建对象,而是在第一次使用的时候,才创建对象
  6.      * @return */@Lazy
  7.     @Beanpublic Person person() {
  8.         System.out.println("给容器中注入Bean^_^ ^_^ ^_^ ^_^");return new Person("许威威", 27);
  9.     }
  10.  
  11. }

    • 测试  

  1. package com.xuweiwei.sping;import com.xuweiwei.spring.config.MainConfig;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class ConfigurationSpringTest {
  2.  
  3.     @Testpublic void test() {
  4.         ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class);
  5.         String[] names = context.getBeanDefinitionNames();for (String name : names) {
  6.             System.out.println(name);
  7.         }
  8.     }
  9.  
  10. }

1.7 使用FactoryBean注册Bean

  • 示例:

    • ColorFactoryBean.java  

  1. package com.xuweiwei.spring.model;import org.springframework.beans.factory.FactoryBean;/**
  2.  * @describe: 创建Spring提供的FactoryBean
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */public class ColorFactoryBean implements FactoryBean<Color> {/** * 返回一个Color对象,这个对象会添加到容器中
  5.      * @return * @throws Exception     */@Overridepublic Color getObject() throws Exception {return new Color();
  6.     }
  7.  
  8.     @Overridepublic Class<?> getObjectType() {return Color.class;
  9.     }
  10.  
  11.     @Overridepublic boolean isSingleton() {return true;
  12.     }
  13. }

    • MainConfig.java  

  1. package com.xuweiwei.spring.config;import com.xuweiwei.spring.model.ColorFactoryBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 *///配置类==配置文件//告诉Spring这是一个配置类@Configuration //相当于applicationContext.xmlpublic class MainConfig {
  5.  
  6.     @Beanpublic ColorFactoryBean colorFactoryBean(){return new ColorFactoryBean();
  7.     }
  8.  
  9.  
  10. }

    • 测试  

  1. package com.xuweiwei.sping;import com.xuweiwei.spring.config.MainConfig;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class ConfigurationSpringTest {
  2.  
  3.     @Testpublic void test() {
  4.         ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class);
  5.         String[] names = context.getBeanDefinitionNames();for (String name : names) {
  6.             System.out.println(name);
  7.         }
  8.     }
  9.  
  10. }

2 生命周期

2.1 @Bean指定初始化方法和销毁方法

  •  示例:

    • Car.java  

  1. package com.xuweiwei.spring.model;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */public class Car {public Car() {
  5.         System.out.println("构造方法被调用了O(&cap;_&cap;)O哈哈~");
  6.     }public void init() {
  7.         System.out.println("初始化了^_^");
  8.     }public void destroy() {
  9.         System.out.println("销毁了o(╥﹏╥)o");
  10.     }
  11. }

    • MainConfig3.java  

  1. package com.xuweiwei.spring.config;import com.xuweiwei.spring.model.Car;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/**
  2.  * @describe:
  3.  * @author: 不为往事扰,余生只爱笑。
  4.  * @version: 1.0 */@Configurationpublic class MainConfig3 {
  5.  
  6.     @Bean(initMethod = "init",destroyMethod = "destroy")public Car car(){return new Car();
  7.     }
  8.  
  9. }

    • 测试  

  1. package com.xuweiwei.sping;import com.xuweiwei.spring.config.MainConfig3;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class ConfigurationSpringTest {
  2.  
  3.     @Testpublic void test() {
  4.         ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig3.class);
  5.         String[] names = context.getBeanDefinitionNames();for (String name : names) {
  6.             System.out.println(name);
  7.         }
  8.  
  9.         ((AnnotationConfigApplicationContext) context).close();
  10.     }
  11.  
  12. }

3 属性赋值

原文链接:http://www.cnblogs.com/xuweiweiwoaini/p/10479717.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号