- Bean的实例化
(1)构造器实例化(最常用)
package com.itheima.instance.constructor;
public class Bean1{}
在Spring的配置文件中,用过class属性指定其对应的实现类
<bean id="bean1" class="com.itheima.instance.constructor.Bean1"></bean>
(2)静态工厂方式是实例化
创建MybeanFactory类
package com.itheima.instance.static_factory;
public class MyBeanFactory{
pubic static bean1 createBean(){
return new Bean1();
}
}
由于这种方式配置Bean后,Spring容器不知道哪个是所需要的工厂方式,所以增加了factory-method属性来告诉Spring容器,其方法名称为createBean。
<bean id="bean1" class="com.itheima.instance.static_factory.MyBeanFactory" factory-method="createBean"/>
(3)实例工厂方式实例化:采用直接创建Bean实例的方式,利用factory-method属性确定使用工厂中的哪个方法。
package com.itheima.instance.factory;
public class MyBeanFactory1{
//创建Bean实例的方法
pubic bean1 createBean(){
return new Bean1();
}
}
<!-- 配置工厂 -->
<bean id="myBeanFactory1" class="com.itheima.instance.factory.MyBeanFactory1"/>
<!--使用factory-bean属性指向配置的实例工厂,
使用factory-method属性确定使用工厂中的哪个方法-->
<bean id="bean1" factory-bean="myBeanFactory1" factory-method="createBean"/>
- Bean的作用域
(1)singleton(单例):该Bean在Spring容器中将只有一个实例
(2)prototype(原型):每次通过Spring容器获取prototye定义的Bean时,容器都将创建一个新的Bean原型
(3)… - Bean的配置方式
(1)基于XML的配置:设值注入和构造注入,Spring首先会调用Bean的默认构造方法来实例化Bean对象,然后通过反射的方式调用setter方法来注入属性值。
设值注入必须满足:
Bean类提供一个默认的无参构造方法
注入的属性提供对应额setter方法
public User(String username,String password,List<String> list){
this.username = username;
this.password = password;
this.list = list;
}
public void setUsername(String username){
this.username = username;
}
public void setPassword(String password){
this.password = password;
}
pubic voic setList(List<String> list){
this.list = list;
}
<!--使用构造注入方法装配User实例-->
<bean id = "user1" class = "....">
<constructor-arg index="0" value="F"/>
<constructor-arg index="1" value="123"/>
<constructor-arg index="2">
<list>
<value>"constructor-value1"</value>
<value>"constructor-value2"</value>
</list>
</constructor-arg>
</bean>
<!--使用设值注入方式装配User实例-->
<bean id = "user2" class = "....">
<property name="username" value="laola"/>
<property name="password" value="123"/>
<property name="list">
<list>
<value>"constructor-value1"</value>
<value>"constructor-value2"</value>
</list>
</property>
</bean>
(2)基于Annotation的装配
Spring中的注解:
- @Component:描述Spring中的Bean,可以作用于任何层次。
- @Repository:用于数据访问层(DAO层)的类标识
- @Controller:通常作用在控制层(Spring MVC的Controller)
- @Service:通常作用在业务层(Service层)
- @Autowired:用于对Bean的属性变量、属性的setter方法及构造方法进行标注,配合对应的注解处理器完成Bean的自动配置,默认按照Bean的类型进行装配。
- @Resource:与@Autowired一样,默认按照Bean的实例名称进行装配。有两个重用属性:name和type。
@Repository("userDao")
public class UserDaoImp UserDao{
}
@Service("userService")
public class UserServiceImpl implements UserService{
@Resource(name="userDao")//相当于在配置文件中的<property name="userDao" ref="userDao"/>
private UserDao userDao:
}
<!--配置文件中编写基于Annotation装配的代码-->
<!--使用context命名空间,在配置文件中开启相应的注解处理器-->
<context:annotation-config/>
<!--分别定义Bean的实例-->
<bean id="userDao" class="........UserDaoImp"/>
<bean id="userService' class=".....UserServiceImpl"/>
上述Spring配置文件中的注解方式仍需要在Spring配置文件中一一配置相应的Bean
为此Spring注解提供了一种高效的注解配置方式(对包路径下的所有Bean文件进行扫描)
<!--使用context命名空间,通知Spring扫描指定包下所有Bean类,进行注解解析-->
<context:component-scan base-package="Bean所在包路径"/>
(3)自动装配:在元素中包含一个autowire属性,设置autowire的属性值来自动装配Bean。
<bean id="userDao" class=".......UserServiceImpl" autowire="byName"/>
设置了 autowire="byName"后,Spring会自动寻找userService Bean中的属性,并将其属性名称与配置文件中定义的Bean做匹配。Spring会自动的将id为userDao的Bean装配到id为userService的Bean中。