组件注册

1 @Configuration注解和@Bean注解

1.1 原来的方式

  • Person.java
package com.sunxiaping.bean;

import java.io.Serializable;

public class Person implements Serializable {
    private String name;
    private Integer age;

    public Person() {
    }

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
View Code
  • applicatoinContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean id="person" class="com.sunxiaping.bean.Person">
        <property name="name" value="张三"/>
        <property name="age" value="123"/>
    </bean>

</beans>
  • 测试:
package com.sunxiaping.test;

import com.sunxiaping.bean.Person;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringTest {

    @Test
    public void test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        Person person = (Person) context.getBean("person");

        System.out.println(person);
    }

}

1.2 纯注解方式

  • Person.java
package com.sunxiaping.bean;

import java.io.Serializable;

public class Person implements Serializable {
    private String name;
    private Integer age;

    public Person() {
    }

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
View Code
  • SpringConfig.java
package com.sunxiaping.config;

import com.sunxiaping.bean.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

// 配置类==配置文件
// @Configuration标注的类说明这个类是一个配置类,相当于原来的applicationContext.xml文件
@Configuration //告诉Spring这是一个配置类
public class SpringConfig {

    // 给容器中注册一个Bean,Bean的id默认是方法名,但是可以通过@Bean注解的属性value或name修改
    // @Bean注解相当于applicationContext.xml文件中的<bean>标签
    @Bean
    public Person person() {
        return new Person("张三", 20);
    }
}
  • 测试:
package com.sunxiaping.test;

import com.sunxiaping.bean.Person;
import com.sunxiaping.config.SpringConfig;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class SpringTest {

    @Test
    public void test() {
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);

        Person person = (Person) context.getBean("person");

        System.out.println(person);
    }

}

2 @CompentScan注解

2.1 原来的方式

  • BookController.java
package com.sunxiaping.controller;

import org.springframework.stereotype.Controller;

@Controller
public class BookController {
}
View Code
  • BookService.java
package com.sunxiaping.service;

import org.springframework.stereotype.Service;

@Service
public class BookService {
}
View Code
  • BookDao.java
package com.sunxiaping.dao;

import org.springframework.stereotype.Repository;

@Repository
public class BookDao {
}
View Code
  • applicationContext.xml
<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 包扫描 只要标注了@Controller、@Service、@Repository、@Component注解 -->
    <context:component-scan base-package="com.sunxiaping"></context:component-scan>

</beans>
  • 测试:
package com.sunxiaping.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringTest {

    @Test
    public void test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        String[] names = context.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }

}

2.2 使用注解的方式

  • BookController.java
package com.sunxiaping.controller;

import org.springframework.stereotype.Controller;

@Controller
public class BookController {
}
View Code
  • BookService.java
package com.sunxiaping.service;

import org.springframework.stereotype.Service;

@Service
public class BookService {
}
View Code
  • BookDao.java
package com.sunxiaping.dao;

import org.springframework.stereotype.Repository;

@Repository
public class BookDao {
}
View Code
  • SpringConfig.java
package com.sunxiaping.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

// 配置类==配置文件
// @Configuration标注的类说明这个类是一个配置类,相当于原来的applicationContext.xml文件
@Configuration //告诉Spring这是一个配置类
@ComponentScan(value = "com.sunxiaping")
public class SpringConfig {


}
  • 测试:
package com.sunxiaping.test;

import com.sunxiaping.config.SpringConfig;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class SpringTest {

    @Test
    public void test() {
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);

        String[] names = context.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }

}
  • 排除某些符合规则的Bean,默认是按照注解。
package com.sunxiaping.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Controller;

// 配置类==配置文件
// @Configuration标注的类说明这个类是一个配置类,相当于原来的applicationContext.xml文件
@Configuration //告诉Spring这是一个配置类
@ComponentScan(value = "com.sunxiaping",excludeFilters = {
        @ComponentScan.Filter(value = Controller.class)
})
public class SpringConfig {


}
  • 只扫描某些符合规则的Bean,默认是按照注解。
package com.sunxiaping.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Controller;

// 配置类==配置文件
// @Configuration标注的类说明这个类是一个配置类,相当于原来的applicationContext.xml文件
@Configuration //告诉Spring这是一个配置类
@ComponentScan(value = "com.sunxiaping", includeFilters = {
        @ComponentScan.Filter(value = Controller.class)
}, useDefaultFilters = false)
public class SpringConfig {


}

3 @Scope注解

3.1 作用

  • 设置组件的作用域。

3.2 原来的方式

  • Person.java
package com.sunxiaping.bean;

import java.io.Serializable;

public class Person implements Serializable {
    private String name;
    private Integer age;

    public Person() {
    }

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
View Code
  • applicationContext.xml
<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="person" class="com.sunxiaping.bean.Person" scope="prototype">
        <property name="name" value="张三"/>
        <property name="age" value="20"/>
    </bean>

</beans>
  • 测试:
package com.sunxiaping.test;

import com.sunxiaping.bean.Person;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringTest {

    @Test
    public void test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        Person person1 = (Person) context.getBean("person");

        Person person2 = (Person) context.getBean("person");

        System.out.println(person1 == person2);
    }

}
  • scope默认是singleton。可以是singleton、prototype、request、session。
  • 默认情况下,IOC容器启动会调用构造方法创建对象放到IOC容器中。以后每次获取就是直接从容器中拿。

3.3 使用注解的方式

  • Person.java
package com.sunxiaping.bean;

import java.io.Serializable;

public class Person implements Serializable {
    private String name;
    private Integer age;

    public Person() {
    }

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
View Code
  • SpringConfig.java
package com.sunxiaping.config;

import com.sunxiaping.bean.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

// 配置类==配置文件
// @Configuration标注的类说明这个类是一个配置类,相当于原来的applicationContext.xml文件
@Configuration //告诉Spring这是一个配置类
public class SpringConfig {


    @Scope(value = "prototype")
    @Bean
    public Person person() {
        return new Person("张三", 20);
    }

}
  • 测试:
package com.sunxiaping.test;

import com.sunxiaping.bean.Person;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringTest {

    @Test
    public void test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        Person person1 = (Person) context.getBean("person");

        Person person2 = (Person) context.getBean("person");

        System.out.println(person1 == person2);
    }

}

4 @Lazy注解

4.1 作用

  • 设置组件为懒加载(容器启动的时候不创建对象,第一次获取Bean的时候创建对象)。对单实例Bean来说。

4.2 原来的方式

  • Person.java
package com.sunxiaping.bean;

import java.io.Serializable;

public class Person implements Serializable {
    private String name;
    private Integer age;

    public Person() {
    }

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
View Code
  • applicationContext.xml
<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="person" class="com.sunxiaping.bean.Person" lazy-init="true">
        <property name="name" value="张三"/>
        <property name="age" value="20"/>
    </bean>

</beans>
  • 测试:
package com.sunxiaping.test;

import com.sunxiaping.bean.Person;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringTest {

    @Test
    public void test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

       
    }

}

4.3 使用注解的方式

  • Person.java
package com.sunxiaping.bean;

import java.io.Serializable;

public class Person implements Serializable {
    private String name;
    private Integer age;

    public Person() {
    }

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
View Code
  • SpringConfig.java
package com.sunxiaping.config;

import com.sunxiaping.bean.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;

// 配置类==配置文件
// @Configuration标注的类说明这个类是一个配置类,相当于原来的applicationContext.xml文件
@Configuration //告诉Spring这是一个配置类
public class SpringConfig {


    @Lazy
    @Scope
    @Bean
    public Person person() {
        return new Person("张三", 20);
    }

}
  • 测试:
package com.sunxiaping.test;

import com.sunxiaping.config.SpringConfig;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class SpringTest {

    @Test
    public void test() {
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        
    }

}

5 @Conditional注解

5.1 作用

  • 按照一定的条件进行判断,满足条件给容器中注册Bean。

5.2 应用示例

  • Person.java
package com.sunxiaping.bean;

import java.io.Serializable;

public class Person implements Serializable {
    private String name;
    private Integer age;

    public Person() {
    }

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
View Code
  • LinuxCondition.java
package com.sunxiaping.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;

public class LinuxCondition implements Condition {


    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {

        Environment environment = context.getEnvironment();

        String property = environment.getProperty("os.name");

        if (property.contains("linux")) {
            return true;
        }
        return false;
    }
}
  • WindowsCondition.java
package com.sunxiaping.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;

public class WindowsCondition implements Condition {
    /**
     * @param context 判断条件能使用的上下文环境
     * @param metadata 注释信息
     * @return
     */
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment environment = context.getEnvironment();

        String property = environment.getProperty("os.name");

        if (property.contains("Windows")) {
            return true;
        }
        return false;
    }
}
  • 测试:
package com.sunxiaping.test;

import com.sunxiaping.bean.Person;
import com.sunxiaping.config.SpringConfig;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class SpringTest {

    @Test
    public void test() {
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);

        Person bean = context.getBean(Person.class);

        System.out.println(bean);

    }

}

6 @Import注解

6.1 概述

猜你喜欢

转载自www.cnblogs.com/xuweiweiwoaini/p/11923806.html
今日推荐