【Spring解决的问题有哪些?】
1. 扩展性问题
传统的应用开发,为了提高代码的重用性,很多代码耦合性较大,对于用户量持续增长,访问量持续增加的网络应用来说,扩展应用就显得非常麻烦。Spring为我们解决了这个问题。
2. 消除模板代码
JDBC数据访问的时候,数据库的连接,注册,释放都是重复的工作。Spring帮我们消除这样的模板代码。
3. 减少try catch
很多资源释放,异常捕获是预判问题的方式,Spring帮我们解决了此类问题。
4. 不可避免的非功能性代码
事务管理,安全检查,站点负载等问题都是需要考虑但是与业务逻辑不太相关的问题,Spring试着帮我们解决了此类问题。
5. 单元测试
代码之间的耦合和依赖关系让单元测试变得复杂困难,Spring帮我们解决了。
【Spring解决上述问题的方法和工具?】
1. POJO类
对于非侵入性的POJO类是最好不过了。对于框架不需要接口或类的依赖,侵入性低,便于测试和使用。
2.依赖注入DI
通过接口解耦是一种常用的手段,Spring为我们统一管理Bean,为依赖注入提供便利,为解耦提供了可能。
3. 声明式编程
我们只是说明要做什么,但不具体指出怎么去做,xml和注解让声明式编程更为简单地实现。
4. 使用切面编程和模板消除样板代码
5.分层设计
层与层之间不做耦合,做好自己层面的事情,其它层的实现完全可以实现插拔式替换。
【Spring模块】
Core:提供创建Bean和依赖注入的功能。
Beans:是一种工厂模式的设计,统一管理类与对象
Context:提供企业级应用支持,如EJB,JMX,basic Remoting等等。
SpEL:就是一种表达式语言,用于方便地获取、设置值。
JDBC:提供了基于JDBC的数据库连接模板。
ORM:提供对ORM框架的支持
OXM:提供对象到xml的映射支持
JMS:提供异步消息传递的抽象功能
Transaction:事务支持
Web:提供web应用开发的支持
Servlet:提供MVC框架,实现快捷处理web请求与响应的功能。
Web Socket:提供双向通信支持。
AOP:提供切面编程的支持。
Aspects:提供对AspectJ的支持
Instrumentation:为类加载,自定义代码插入提供可能。
Instrumentation Tomcat:提供tomcat支持
Messaging:提供基于STOMP的信息传递。
Test:提供单元测试功能。
Security:提供声明式安全验证
Batch:批量处理模块
Spring integration:提供与其他应用程序的交互,JMS就是其中一种。
Mobile:为手机应用提供支持
LDMP:提供基于模板的开发支持。
.New: 提供对.NET开发支持
【Spring容器】
控制反转:
我们需要对象的时候,让Spring为我们提供,而不是手动去创建(new),这样就减少了依赖关系。
使用BeanFactory(历史版本)
1. 创建项目,导入jar包
2.创建配置文件 beans_classpath.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
3.读取配置获得BeanFactory
BeanFactory beanFactory=new XmlBeanFactory(new ClassPathResource("beans_classpath.xml"));
或者从文件系统获取:
BeanFactory beanFactory=new XmlBeanFactory(new FileSystemResource("d:\\beans_fileSystem.xml"));
ApplicationContext(现在流行)
1. 创建项目,导入jar包
2. 创建配置文件beans_classpath.xml
3.使用ClassPathXmlApplicationContext加载BeanFactory
try {
ApplicationContext context=new ClassPathXmlApplicationContext("beans_classpath.xml");
System.out.println("container created successfully");
}
catch (BeansException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
如果是从多个配置文件读取配置:
try {
ApplicationContext context1 = new ClassPathXmlApplicationContext(new String[]{"beans_classpath.xml","beans_classpath1.xml" });
}
catch (BeansException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
也可以使用FileSystemXmlApplicationContext
try {
ApplicationContext context=new FileSystemXmlApplicationContext("d:\\beans_fileSystem.xml");
System.out.println("container created successfully");
}
catch (BeansException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}