1 @Configuration注解和@Bean注解
1.1 原来的方式
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
<?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 纯注解方式
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
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 原来的方式
package com.sunxiaping.controller;
import org.springframework.stereotype.Controller;
@Controller
public class BookController {
}
View Code
package com.sunxiaping.service;
import org.springframework.stereotype.Service;
@Service
public class BookService {
}
View Code
package com.sunxiaping.dao;
import org.springframework.stereotype.Repository;
@Repository
public class BookDao {
}
View Code
<?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 使用注解的方式
package com.sunxiaping.controller;
import org.springframework.stereotype.Controller;
@Controller
public class BookController {
}
View Code
package com.sunxiaping.service;
import org.springframework.stereotype.Service;
@Service
public class BookService {
}
View Code
package com.sunxiaping.dao;
import org.springframework.stereotype.Repository;
@Repository
public class BookDao {
}
View Code
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);
}
}
}
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 {
}
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 原来的方式
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
<?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 使用注解的方式
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
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 原来的方式
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
<?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 使用注解的方式
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
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 应用示例
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
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;
}
}
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 概述