使用ioc容器创建对象
1.调用无参数构造方法
<bean id= class= ></bean>
2.调用有参数构造方法
<bean id="str" class="java.lang.String"><constructor-arg type="java.lang.String" value="jack"></constructor-arg>
</bean>
<bean id="user" class="com.xulifei.spring01.hello.User" scope="singleton" lazy-init="false">
<constructor-arg index="0" type="int" value="100"></constructor-arg>
<constructor-arg index="1" type="java.lang.String" ref="str"></constructor-arg>
</bean>
3.工厂
静态工厂、非静态工厂
<!-- 使用factory对象的方法,此方法一定是非静态的 -->
<bean id="factory" class="com.xulifei.spring01.hello.ObjectFactory">
</bean>
<bean id="User2" factory-bean="factory" factory-method="getInstance"></bean>
<!-- 使用静态方法创建,此方法一定是静态的 -->
<bean id="User3" class="com.xulifei.spring01.hello.ObjectFactory" factory-method="getStaticInstance"></bean>
使用ioc容器解决对象依赖关系
spring中如何给对象赋值
1.通过构造函数
<bean id="userDao" class="com.xulifei.spring01.hello.UserDao"></bean>
<bean id="userService" class="com.xulifei.spring01.hello.UserService">
<constructor-arg index="0" value="1"></constructor-arg>
<constructor-arg index="1" value="2"></constructor-arg>
<constructor-arg index="2" ref="userDao"></constructor-arg>
</bean>
user类中不需要提供setget方法,只需要提供构造方法
public UserService(int id,String name,UserDao userDao) {
this.id = id;
this.name = name;
this.userDao = userDao;
}
2.通过set方法给属性注入值
<bean id="user" class="com.xulifei.spring01.hello.User">
<property name="a" value="100"></property>
<property name="name" value="jack"></property>
</bean>
给对象属性注入值
i.
<bean id="user" class="com.xulifei.spring01.hello.User">
<property name="对象变量名" ref="在bean中配置了的创建对象id"></property>
</bean>
ii.内部bean
<!--内部bean-->
<bean id="action" class="com.xulifei.conAction">
<property name="service">
<bean class="com.xulifei.service" >
<property name="dao">
<bean class="com.xulifei.dao"></bean>
</property>
</bean>
</property>
</bean>
内部bean无法共享且不易维护
user类提供set方法,可以用在action、service、dao中
在action的配置中应该写明scope=prototype
3.p名称空间
<!--
p命名空间赋值,spring3.0以上支持
-->
引用赋值
<bean id="userDao" class="com.xulifei.userDao" ></bean>
<bean id="userService" class="com.xulifei.userService" p:userDao-ref="userDao"></bean>
<bean id="userAction" class="com.xulifei.userAction" p:userService-ref="userService"></bean>
基本赋值
<bean id="user" class="com.xulifei.spring01.hello.User" p:a="100" p:name="xulifei"></bean>
需要提供set方法
4.自动装配
全局配置 http://www.springframework.org/schema/context/spring-context.xsd" default-autowire="byName"><!-- 全局的根据名称自动装配,不用每个bean去配-->
<!--根据名称自动装配:去ioc容器中去找与属性同名的对象 -->
<bean id="userDao" class="com.xulifei.UserDao"></bean>
<bean id="userService" class="com.xulifei.UserService" autowire="byName"></bean>
<bean id="userAction" class="com.xulifei.UserAction" autowire="byName"></bean>
<!-- 根据类型自动装配,必须确保ioc容器中必须只有一个该类型的对象-->
<bean id="userDao" class="com.xulifei.UserDao"></bean>
<bean id="userService" class="com.xulifei.UserService" autowire="byType"></bean>
<bean id="userAction" class="com.xulifei.UserAction" autowire="byType"></bean>
也可以配置全局
自动装配简化了配置,但是不利于维护
需要提供set方法
5.注解
创建对象把引用名称放入ioc容器中,默认与类名一样且第一个字母小写
@Component
@Repository
@Service
@Controller
相当于<bean id="..." class="..."></bean>
名称id可以任意定义
@Component("userDao")
@Repository("userDao")
@Service("userService")
@Controller("userAction")
@Resource根据类型查看,【在ioc容器中确保该类型只有一个变量】
3,4,5都是2的优化
以上注意了,通过ioc创建的对象,都需要从ioc容器中拿,包括依赖的对象,直接new出来的是没用的,依赖关系得不到维护
例如: UserService userService = (UserService) applicationContext.getBean("userService");
userService.save();
如果直接是new UserService.save();会爆空指针异常,因为userservice中的userdao没有被注入;
xml和注解可以一起使用。