核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
Spring AOP: 通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写 的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。
依赖注入、控制反转
依赖注入:在运行期,由外部容器动态地将依赖对象注入到组件中
控制反转:应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部窗口负责得。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓的反转。]
spring
控制反转/依赖注入---面向切入编程---与主流框架的整合
Example
beans.xml
<bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl"> </bean> <bean id="ud" class="com.bjsxt.dao.impl.UserDAOImpl2"> </bean> <bean id="userService" class="com.bjsxt.service.UserService"> <property name="userDAO" ref="u" /> </bean>
test.java
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); UserService service = (UserService)ctx.getBean("userService"); User u = new User(); u.setUsername("zhangsan"); u.setPassword("zhangsan"); service.add(u);
作用域
singleton:返回bean 的同一个实例,也是默认的作用域(无状态bean使用此作用域)
prototype:每次请求都会创建一个实例(有状态bean 使用此作用域)
request、session、global session 这三个作用域主要用在web 应用中
生命周期
初始化
当scope=singleton,即默认情况,会在装载配置文件时实例化。如果希望在调用getBean时才初始化,可以使用lazy-init="true" 补充:如果希望希望该配置文件中的所有bean都延迟初始化,则应在beans根结点中使用lazy-init="true"。当scope=prototype 时,在调用getBean()方法时才会初始化。
构造器、init 方法、获取bean 后的操作、destroy 方法(ctx.close、注意如果bean 的scope设为prototype 时,当ctx.close 时
<bean id="ud" class="com.bjsxt.dao.impl.UserDAOImpl2">
</bean>
<bean id="userService" class="com.bjsxt.service.UserService">
<property name="userDAO" ref="u" />
</bean>
,destroy 方法不会被调用)
属性注入
在相应的字段上一定要有setter 方法,才能注入
<bean id="userServiceBean" class="com.asm.service.UserServiceBean"> <property name="id" value="10"></property> <property name="username" value="张某某"></property> </bean>
<bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl2"> </bean> <bean id="userService" class="com.bjsxt.service.UserService"> <property name="userDAO" ref="u" /> </bean>
集合注入
<bean name="userDAO" class="com.bjsxt.dao.impl.UserDAOImpl"> <property name="sets"> <set> <value>1</value> <value>2</value> </set> </property> <property name="lists"> <list> <value>1</value> <value>2</value> <value>3</value> </list> </property> <property name="maps"> <map> <entry key="1" value="1"></entry> <entry key="2" value="2"></entry> <entry key="3" value="3"></entry> <entry key="4" value="4"></entry> </map> </property> </bean>
public class UserDAOImpl implements UserDAO { /* (non-Javadoc) * @see com.bjsxt.dao.UserDAO#save(com.bjsxt.model.User) */ private Set<String> sets; private List<String> lists; private Map<String , String> maps;
初始化与销毁函数的注入
<bean id="userService" class="com.bjsxt.service.UserService" init-method="init" destroy-method="destroy" scope="singleton"> <!-- <property name="userDAO" ref="u" /> --> <constructor-arg> <ref bean="u"/> </constructor-arg> </bean>
构造函数的注入
<bean id="userServiceBean2" class="com.asm.service.UserServiceBean"> <constructor-arg index="0" value="李某某"/> <constructor-arg index="1" ref="userDaoImpl" /> <constructor-arg index="2"> <list> <value>List值一</value> <value>List值二</value> <value>List值三</value> </list> </constructor-arg> </bean>
publicUserServiceBean(String username, UserDao userDao, Set<String> set) { this.username=username; this.userDao=userDao; this.set=set; }
开启注解功能
<?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-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <context:annotation-config /> </beans>
@Autowired注解规则
可以省略get与set方法
bytype
默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false) .如果我们想使用名称装配可以结合 @Qualifier注解进行使用;
public class UserService { @Autowired @Qualifier("u2") private UserDAO userDAO; public void add(User user) { userDAO.save(user); } }
@resource
默认安装名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装 配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
@Resource public void setUserDAO( UserDAO userDAO) { this.userDAO = userDAO; } @Resource(name=“”) public void setUserDAO( UserDAO userDAO) { this.userDAO = userDAO; }
如果将@requied或者@autowired写了set方法之上,则程序会走到set方法内部。但如果写在了field之上,则不会进入set方法当中。
@component
在beans下面
<context:annotation-config /> <context:component-scan base-package="com.bjsxt"/>//指定自动管理的包名
在类中
@Component("u") public class UserDAOImpl implements UserDAO { public void save(User user) { System.out.println("user saved!"); } }
@comnonent的效果:相当于在xml中beans下面定义了bean的配置
@service (业务层组件)、@controller(控制层组件)、@repository功能类似
@Component("userService1") public class UserService { private UserDAO userDAO; @Resource(name="u") public void setUserDAO( UserDAO userDAO) { this.userDAO = userDAO; } @PostConstruct public void init() { System.out.println("init"); } @PreDestroy public void destroy() { System.out.println("destroy"); }
首先先加载ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");即 读beans.xml里面的内容,然后通过
<context:component-scan base-package="com.bjsxt"/>找从com.bjsxt开始“scan”含@component的类
@Component("userService1")找到后就初始化对象,在初始化对象的时候遇到了@Resource(name="u"),继续寻找有@Component("u")的注解
second example
packagecom.asm.service; @Service("usb") /如果使用Service这些注解时不指定名称,这些实例bean的名称就是类名(但首字母小写) @Scope("singleton") public class UserServiceBean { @Resource(name = "userDaoImpl") private UserDao userDao; private UserDao userDao2; @Autowired(required = true) @Qualifier("userDaoImpl") private UserDao userDao3; @Resource public void setUserDao2(UserDao userDao2) { this.userDao2 = userDao2; } publicUserServiceBean() { } @PostConstruct public void init() { System.out.println("init method is called"); } public void test() { System.out.println("********************************"); userDao.save(); userDao2.save(); System.out.println(userDao3); // userDao3.save(); System.out.println("********************************"); } }