Spring 关于bean的管理有几种方法,常见的有基于注解的javaConfig开发,XML开发,作为一名菜鸟XML开发会更适合,简单易懂,官方文档也写的清楚
不过最近看了Spring in action,学习了利用JavaConfig开发
package Model;
import org.springframework.stereotype.Component;
@Component
public class ClassRoom {
private Student student;
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
@Override
public String toString() {
return "ClassRoom [student=" + student + "]";
}
}
package Model;
import org.springframework.stereotype.Component;
@Component
public class Student {
private Integer id;
private String name;
private Integer age;
private String major;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
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;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + ", major=" + major + "]";
}
public void destory(){
System.out.println("close...");
}
}
package SpringConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Profile;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.Scope;
import org.springframework.core.env.Environment;
import Model.ClassRoom;
import Model.Student;
@Configuration
@ComponentScan(basePackages={"Model"})
@PropertySource("classpath:hello.properties")
@Import(value={javaConfigTo.class})
public class javaConfig {
@Autowired
Environment evn;
@Bean(destroyMethod="destory",value="student")
@Scope(scopeName=ConfigurableBeanFactory.SCOPE_SINGLETON)
public Student returnStudent(){
Student stu = new Student();
stu.setId(1);
stu.setName(evn.getProperty("root"));//#利用spel表达式可以更强大,直接指定id获取bean
return stu;
}
@Bean("classRoom")
@Scope(scopeName=ConfigurableBeanFactory.SCOPE_SINGLETON)
public ClassRoom returnClassRoom(){
ClassRoom classRoom = new ClassRoom();
classRoom.setStudent(returnStudent());
return classRoom;
}
}
package SpringConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import Model.Student;
@Configuration
public class javaConfigTo {
@Bean("student2")
public Student returnStudent(){
Student stu = new Student();
stu.setAge(11);
return stu;
}
}
package JunitTest;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import Model.ClassRoom;
import Model.Student;
import SpringConfig.javaConfig;
public class Spring {
private static ApplicationContext context;
static{
context = new AnnotationConfigApplicationContext(javaConfig.class);
}
@Test
public void test() {
Student student =(Student)context.getBean("student");
// Student student2 = (Student) context.getBean("student2");
System.out.println(student);
// System.out.println(student2);
// ClassRoom classRoom = (ClassRoom)context.getBean("classRoom");
// ((AnnotationConfigApplicationContext)context).close();
}
}
@ComponentScan(basePackages={"Model"})//扫描组件管理包
@PropertySource("classpath:hello.properties")//设置引入的属性文件,让我们动态注入,非硬编码
@Import(value={javaConfigTo.class})//有点像XML的import,可以分割多分xml配置文件,这里可以结合XML文件也可以多个javaConfig
@Scope(scopeName=ConfigurableBeanFactory.SCOPE_SINGLETON)//作用域
@Autowired
Environment evn;//这个类为我们封装了从引入属性文件获得属性
ps:记一个bean作用域管理的一个小知识点
一般单例模式就可以满足我们的开发,可是如果我们有时候需要基于会话或者请求来获得bean,那么得利用下面的注解
@Scope(value=WebApplicationContext.SCOPE_SESSION,proxyMode=ScopedProxyMode.INTERFACES)
比如购物车的接口,我们希望每个用户都拥有一个属于自己的购物车,所以不能是单例的,但是使用原型又显得过于浪费,性能不高,所以要利用这个注解,他用了代理模式。
当然,如果是类代理的话要使用CGLib代理,就把注解改为
@Scope(value=WebApplicationContext.SCOPE_SESSION,proxyMode=ScopedProxyMode.TARGET_CLASS)
他在对应xml的配置需要引入aop命名空间 <aop:scoped-proxy/> 或者 <aop:scoped-proxy proxy-target-class='false'/ >