带参数的构造函数创建对象
首先,JavaBean就要提供带参数的构造函数:
public User(String id, String username) { this.id = id; this.username = username; }
接下来,关键是怎么配置applicationContext.xml文件了。
<bean id="user" class="User"> <!--通过constructor这个节点来指定构造函数的参数类型、名称、第几个--> <constructor-arg index="0" name="id" type="java.lang.String" value="1"></constructor-arg> <constructor-arg index="1" name="username" type="java.lang.String" value="zhongfucheng"></constructor-arg> </bean>
在constructor上如果构造函数的值是一个对象,而不是一个普通类型的值,我们就需要用到ref属性了,而不是value属性
比如说:我在User对象上维护了Person对象的值,想要在构造函数中初始化它。因此,就需要用到ref属性了
<bean id="person" class="Person"></bean> <bean id="user" class="User" > <!--通过constructor这个节点来指定构造函数的参数类型、名称、第几个--> <constructor-arg index="0" name="id" type="java.lang.String" value="1"></constructor-arg> <constructor-arg index="1" name="username" type="java.lang.String" ref="person"></constructor-arg> </bean>
工厂静态方法创建对象
首先,使用一个工厂的静态方法返回一个对象
public class Factory { public static User getBean() { return new User(); } }
配置文件中使用工厂的静态方法返回对象
<!--工厂静态方法创建对象,直接使用class指向静态类,指定静态方法就行了--> <bean id="user" class="Factory" factory-method="getBean" > </bean>
工厂非静态方法创建对象
首先,也是通过工厂的非非静态方法来得到一个对象
public class Factory { public User getBean() { return new User(); } }
配置文件中使用工厂的非静态方法返回对象
<!--首先创建工厂对象--> <bean id="factory" class="Factory"/> <!--指定工厂对象和工厂方法--> <bean id="user" class="User" factory-bean="factory" factory-method="getBean"/>
c名称空间
我们在使用XML配置创建Bean的时候,如果该Bean有构造器,那么我们使用<constructor-arg>
这个节点来对构造器的参数进行赋值…
<constructor-arg>
未免有点太长了,为了简化配置,Spring来提供了c名称空间…
要想c名称空间是需要导入xmlns:c="http://www.springframework.org/schema/c"
的
<bean id="userService" class="bb.UserService" c:userDao-ref=""> </bean>
c名称空间有个缺点:不能装配集合,当我们要装配集合的时候还是需要<constructor-arg>
这个节点
装载集合
如果对象上的属性或者构造函数拥有集合的时候,而我们又需要为集合赋值,那么怎么办?
- 在构造函数上,普通类型
<bean id="userService" class="bb.UserService" > <constructor-arg > <list> //普通类型 <value></value> </list> </constructor-arg> </bean>
- 在属性上,引用类型
<property name="userDao"> <list> <ref></ref> </list> </property>
注解方式
自从jdk5有了注解这个新特性,我们可以看到Struts2框架、Hibernate框架都支持使用注解来配置信息…
通过注解来配置信息就是为了简化IOC容器的配置,注解可以把对象添加到IOC容器中、处理对象依赖关系,我们来看看怎么用吧:
使用注解步骤:
- 1)先引入context名称空间
- xmlns:context="http://www.springframework.org/schema/context"
- 2)开启注解扫描器
<context:component-scan base-package=""></context:component-scan>
- 第二种方法:也可以通过自定义扫描类以@CompoentScan修饰来扫描IOC容器的bean对象。。如下代码:
//表明该类是配置类 @Configuration //启动扫描器,扫描bb包下的 //也可以指定多个基础包 //也可以指定类型 @ComponentScan("bb") public class AnnotationScan { }
在使用@ComponentScan()这个注解的时候,在测试类上需要@ContextConfiguration这个注解来加载配置类…
- @ContextConfiguration这个注解又在Spring的test包下..
创建对象以及处理对象依赖关系,相关的注解:
- @ComponentScan扫描器
- @Configuration表明该类是配置类
- @Component 指定把一个对象加入IOC容器--->@Name也可以实现相同的效果【一般少用】
- @Repository 作用同@Component; 在持久层使用
- @Service 作用同@Component; 在业务逻辑层使用
- @Controller 作用同@Component; 在控制层使用
- @Resource 依赖关系
- 如果@Resource不指定值,那么就根据类型来找,相同的类型在IOC容器中不能有两个
- 如果@Resource指定了值,那么就根据名字来找
测试代码:
- UserDao
package aa; import org.springframework.stereotype.Repository; /** * Created by ozc on 2017/5/10. */ //把对象添加到容器中,首字母会小写 @Repository public class UserDao { public void save() { System.out.println("DB:保存用户"); } }
- userService
package aa; import org.springframework.stereotype.Service; import javax.annotation.Resource; //把UserService对象添加到IOC容器中,首字母会小写 @Service public class UserService { //如果@Resource不指定值,那么就根据类型来找--->UserDao....当然了,IOC容器不能有两个UserDao类型的对象 //@Resource //如果指定了值,那么Spring就在IOC容器找有没有id为userDao的对象。 @Resource(name = "userDao") private UserDao userDao; public void save() { userDao.save(); } }
- userAction
package aa; import org.springframework.stereotype.Controller; import javax.annotation.Resource; /** * Created by ozc on 2017/5/10. */ //把对象添加到IOC容器中,首字母会小写 @Controller public class UserAction { @Resource(name = "userService") private UserService userService; public String execute() { userService.save(); return null; } }
- 测试
package aa; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * Created by ozc on 2017/5/10. */ public class App { public static void main(String[] args) { // 创建容器对象 ApplicationContext ac = new ClassPathXmlApplicationContext("aa/applicationContext.xml"); UserAction userAction = (UserAction) ac.getBean("userAction"); userAction.execute(); } }