一、定义bean的三种途径:
- 首先编写Student和Teacher两个类
-
public class Student { private String name; private Teacher teacher; public String getName() { return name; } public void setName(String name) { this.name = name; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } }
public class Teacher { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
-
- 方法一:基于XML的bean定义(需要提供setter方法)
-
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="student" class="test.Student"> <property name="name" value="张三"/> <property name="teacher" ref="teacher"/> </bean> <bean id="teacher" class="test.Teacher"> <property name="name" value="李四"/> </bean> </beans> [java] view plain copy public class Main { public static void main(String args[]){ FileSystemXmlApplicationContext context=new FileSystemXmlApplicationContext("applicationContext.xml的绝对路径"); Student student= (Student) context.getBean("student"); Teacher teacher= (Teacher) context.getBean("teacher"); System.out.println("学生的姓名:"+student.getName()+"。老师是"+student.getTeacher().getName()); System.out.println("老师的姓名:"+teacher.getName()); } }
- 方法二:基于注解的bean定义(不需要提供setter方法)
Spring为此提供了四个注解,这些注解的作用与上面的XML定义bean效果一致,在于将组件交给Spring容器管理。组件的名称默认是类名(首字母变小写),也可以自己修改:@Component:当对组件的层次难以定位的时候使用这个注解@Controller:表示控制层的组件@Service:表示业务逻辑层的组件@Repository:表示数据访问层的组件使用这些注解的时候还有一个地方需要注意,就是需要在applicationContext.xml中声明<contex:component-scan...>一项,指明Spring容器扫描组件的包目录。 -
@Component("teacher") public class Teacher { @Value("李四") private String name; public String getName() { return name; } } [java] view plain copy @Component("student") public class Student { @Value("张三") private String name; @Resource private Teacher teacher; public String getName() { return name; } public Teacher getTeacher() { return teacher; } } [html] view plain copy <?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"> <!--扫描组件的包目录--> <context:component-scan base-package="test"/> </beans> [java] view plain copy public class Main { public static void main(String args[]){ FileSystemXmlApplicationContext context=new FileSystemXmlApplicationContext("applicationContext.xml的绝对路径"); Student student= (Student) context.getBean("student"); Teacher teacher= (Teacher) context.getBean("teacher"); System.out.println("学生的姓名:"+student.getName()+"。老师是"+student.getTeacher().getName()); System.out.println("老师的姓名:"+teacher.getName()); } }
- 方法三:基于Java类的bean定义(需要提供setter方法)
-
@Configuration public class BeansConfiguration { @Bean public Student student(){ Student student=new Student(); student.setName("张三"); student.setTeacher(teacher()); return student; } @Bean public Teacher teacher(){ Teacher teacher=new Teacher(); teacher.setName("李四"); return teacher; } } [java] view plain copy public class Main { public static void main(String args[]){ AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(BeansConfiguration.class); Student student= (Student) context.getBean("student"); Teacher teacher= (Teacher) context.getBean("teacher"); System.out.println("学生的姓名:"+student.getName()+"。老师是"+student.getTeacher().getName()); System.out.println("老师的姓名:"+teacher.getName()); } }
二、Spring的自动注入
- Spring提供了五种自动装配的类型
no:顾名思义, 显式指明不使用Spring的自动装配功能byName:根据属性和组件的名称匹配关系来实现bean的自动装配byType:根据属性和组件的类型匹配关系来实现bean的自动装配,有多个适合类型的对象时装配失败constructor:与byType类似是根据类型进行自动装配,但是要求待装配的bean有相应的构造函数autodetect:利用Spring的自省机制判断使用byType或是constructor装配- 基于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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="student" class="test.Student" autowire="byName"> <property name="name" value="张三"/> </bean> <bean id="teacher" class="test.Teacher"> <property name="name" value="李四"/> </bean> </beans>
这里我并没有显式为Student对象注入Teacher属性,而是使用autowired="byName"代替,这样一来Spring会帮我们处理这些细节,将名字是teacher的组件注入到Student对象中。- 基于注解的自动装配
其实上面已经应用过了,这里再提一下@Resource和@Autowired的区别。@Resource默认是使用byName进行装配,@Autowired默认使用byType进行装配。@Component("teacher") public class Teacher { @Value("李四") private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } @Component("student") public class Student { @Value("张三") private String name; @Resource private Teacher teacher; public String getName() { return name; } public void setName(String name) { this.name = name; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } }
三、如何进行选择?
-
-
<property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/study"/> <property name="username" value="账号"/> <property name="password" value="密码"/> </bean>
-