Spring主要解决对象的创建及对象之间的依赖关系
1 IOC容器,控制反转,主要作用是对象的创建交给该容器
2 依赖注入,解决对象之间的依赖关系
3 AOP,面向切面编程
一、IOC容器相关属性,applicationContext.xml配置文件一些属性说明,在3.0之后没有该文件,需要自己去创建。简单例子如下
<?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:p="http://www.springframework.org/schema/p" 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">
<!-- 所有要创建的对象配置都在此处配置 -->
<bean id="user" class="com.huitong.entity.User"></bean>
</beans>
1 scope,可以取值singleton,prototype
singleton是单例模式,在IOC容器创建之前就创建了对象。
prototype多例模式,用到对象才创建。在IOC容器创建之后创建。
2 init-method="init_user" destroy-method="destroy_user",这两个属性是在对象创建之后和销毁之前执行初始化、销毁动作。
二、springIOC容器,是spring核心内容
主要作用是创建对象、处理对象的依赖关系。一个对象一个bean相对应,如果不创建对象,就不用指定bean属性。class指定使用哪个类。
1 constructor-arg用来指定带参构造函数参数值。
2 ref用来指定引用bean值,不用value属性了。
3 使用工厂类来创建对象有两种方式,1)使用工厂对象创建对象 2)使用静态方法创建对象
关键属性是
class=""//指定哪个工厂类,在静态方法中使用
factory-bean=""//使用工厂对象创建对象,
factory-method=""//指定使用那个方法创建对象
三、类属性赋值在spring中常用方法
1 使用带参数构造函数,配置如下
<bean id="user2" class="com.huitong.entity.User" factory-bean="" factory-method=""> <constructor-arg index="0" value="1" type="int"></constructor-arg> <constructor-arg index="1" value="allen" ></constructor-arg> </bean>
简单测试
public void fun2(){ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("com/baidu/entity/applicationContext.xml"); User user2 = (User) context.getBean("user2"); System.out.println(user2); }
在MVC模式中经常使用到dao/service/action
现在以user对象做一个简单例子,userDao,userService,userAction类如下
public class UserDao { public UserDao() { // TODO Auto-generated constructor stub } public void saveUser(){ System.out.println("保存user"); } } public class UserService { private UserDao userDao; public UserService() { // TODO Auto-generated constructor stub } public UserDao getUserDao() { return userDao; } public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void saveUser(){ userDao.saveUser(); } } public class UserAction { private UserService userService; public UserAction() { } public UserService getUserService() { return userService; } public void setUserService(UserService userService) { this.userService = userService; } public void save(){ userService.saveUser(); } }
2 set方法注入,属性关键字property,配置如下
<bean id="userDao" class="com.baidu.entity.UserDao"></bean> <bean id="userService" class="com.baidu.entity.UserService"> <property name="userDao" ref="userDao"></property> </bean> <bean id="userAction" class="com.baidu.entity.UserAction"> <property name="userService" ref="userService"></property> </bean>
类对象如果有属性,需要有set方法,才可以使用该方法注入属性。
简单测试
public void fun3(){ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("com/baidu/entity/bean.xml"); UserAction userAction = (UserAction) context.getBean("userAction"); userAction.save(); }
3 p名称空间,需要在配置文件中引入p schemal,xmlns:p="http://www.springframework.org/schema/p"。配置如下
<bean id="userDao" class="com.huitong.entity.UserDao"></bean> <bean id="userService" class="com.huitong.entity.UserService" p:userDao-ref="userDao"></bean> <bean id="userAction" class="com.huitong.entity.UserAction" p:userService-ref="userService"></bean>
其中使用...-ref是说明引用的是之前的定义的对象,如果直接类似是p:userDao=""说明使用的是值。