软件体系结构 & 架构技术知识点总结(建议收藏)
Posted 二哈喇子!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件体系结构 & 架构技术知识点总结(建议收藏)相关的知识,希望对你有一定的参考价值。
文章目录
- 页面技术
- 一、Spring框架
- 二、SpringJDBCTemplate
- 三、SpringMVC
- 1. 典型的Web层框架包括:
- 2. Spring MVC的特点。
- 3. Spring MVC主要有如下优点:
- 4. Spring MVC框架的工作流程如下:
- 5. 在web.xml中,配置Spring MVC的前端控制器DispatcherServlet
- 6. 控制器方法的返回值类型
- 7. @Controller注解在使用时可分为如下两步:
- 8. SpringMVC框架下请求处理方法的参数类型:
- 9. SpringMVC中获取输入值的方式主要有:
- 10. SpringMVC中对用户的响应方式主要有:
- 11. @RequestParam注解
- 12. 在使用包装POJO类型数据绑定时
- 13. JSON数据交互时,主要使用的两个注解@RequestBody和@ResponseBody
- 14. JSON对象的数组结构
- 15. RESTful
- 16. @PathVariable("id")注解
- 17. Spring MVC的文件上传
- 四、拦截器
- 五、Mybatis
- 六、SSM框架整合
- 七、SpringAOP和事务控制
页面技术
提示:这里可以添加本文要记录的大概内容:
JSP(web服务器端技术)、JSTL标签库、EL表达式、bootstrap页面模板(静态html、CSS、JS))
采用传统开发模式时,页面需要用到jsp技术(JSTL标签库、EL表达式)。
前后端分离的开发模式,页面使用VUE框架,后端服务使用SSM或者是SpringBoot。
EL表达式的思维导图如下:
提示:以下是本篇文章正文内容,下面案例可供参考
一、Spring框架
1. 三层体系架构
在实际开发中,通常服务器端在采用分层方式进行架构。三层体系架构,分别为表示层(Web层,包括控制层,使用SpringMVC框架)、业务逻辑层(Service,使用Spring框架)、持久层(数据访问层,Dao,使用Mybatis框架), Spring对每一层都提供了技术支持。
2. Spring的核心
Spring的核心是控制反转(IoC: Inverse of Control )和面向切面编程(AOP: Aspect Oriented Programming )。
在使用Spring框架之后,对象的实例不再由调用者来创建,而是由Spring容器来创建,Spring容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制。
IoC的全称是Inversion of Control,中文名称为控制反转。控制反转就是指在使用Spring框架之后,对象的实例不再由调用者来创建,而是由Spring容器来创建,Spring容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制。这样,控制权由应用代码转移到了Spring容器,控制权发生了反转。
DI的全称是Dependency Injection,中文称之为依赖注入。它与控制反转(IoC)的含义相同,只不过这两个称呼是从两个角度描述的同一个概念。从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,这相当于为调用者注入了它依赖的实例,这就是Spring的依赖注入。
3. Spring 的Bean中主要的装配方式
Spring 的Bean中主要包含三种装配方式,分别为基于XML的装配,基于Annotation的装配和自动装配,这三种装配方式的用法如下:
(1)基于XML的装配:
Spring提供了2种基于XML的装配方式:设值注入(Setter Injection)和构造注入(Constructor Injection)。
一种是属性setter方法注入(或设值注入),另一种是构造方法注入。属性setter方法注入是指IoC容器使用setter方法来注入被依赖的实例。通过调用无参构造器或无参静态工厂方法实例化Bean后,调用该Bean的setter方法,即可实现基于setter方法的依赖注入。属性setter方法注入的必备条件如下:
Bean类必须有一个无参构造方法
Bean类必须为属性提供setter方法
在配置文件中,使用<property>
元素来为每个属性注入值
设置注入中的Bean类必须提供一个默认的无参构造方法,同时必须为需要注入的属性提供对应的setter方法。使用设值注入时,在Spring配置文件中,需要使用<bean>
元素的子元素<property>
来为每个属性注入值。使用构造注入时,在配置文件里,需要使用<bean>
元素的子元素<constructor-arg>
来定义构造方法的参数,可以使用其value属性(或子元素)来设置该参数的值。
构造方法注入是指IoC容器使用构造方法来注入被依赖的实例。基于构造方法的依赖注入通过调用带参数的构造方法来实现,每个参数代表着一个依赖。要求必须满足如下条件:
Bean类必须提供有参构造方法
配置文件中,使用元素来为参数注入值
(2)基于Annotation的装配:
使用基于Annotation的装配时,首先需要使用@Repository、@Service与@Controller分别对实现类进行标注,然后用@Autowired或@Resource注解对注入的Bean的属性进行标注,最后在Spring的配置文件中,通过<context:annotation-config />
来开启注解处理器,或使用<context:component-scan base-package="Bean所在的包路径"/>
的配置方式即可实现Annotation的装配。
@Controller通常作用在控制层,用于将控制层的类标识为Spring中的Bean。
@Service通常作用在业务层,用于将业务层的类标识为Spring中的Bean。
@Repository通常作用在数据持久层(或数据访问层,DAO层),用于将数据持久层的类标识为Spring中的Bean。
@Autowired或@Resource注解对注入的Bean的属性进行标注,用于将实例化后对象注入到Bean的属性中,实现依赖注入。
(3)自动装配:
在<bean>
元素中使用 autowire属性,并将其属性值设置为 byName或者 byType即可实现自动装配。
4. Spring框架的优点如下:
(1)非侵入式设计:Spring是一种非侵入式(non-invasive)框架,它可以使应用程序代码对框架的依赖最小化。
(2)方便解耦、简化开发:Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护工作都交给Spring容器管理,大大的降低了组件之间的耦合性。
(3)支持AOP:Spring提供了对AOP的支持,它允许将一些通用任务,如安全、事务、日志等进行集中式处理,从而提高了程序的复用性。
(4)支持声明式事务处理:只需要通过配置就可以完成对事务的管理,而无需手动编程。
(5)方便程序的测试:Spring提供了对Junit4的支持,可以通过注解方便的测试Spring程序。
(6)方便集成各种优秀框架:Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持。
(7)降低了Java EE API的使用难度:Spring对Java EE开发中非常难用的一些API(如:JDBC、JavaMail等),都提供了封装,使这些API应用难度大大降低。
5. Spring框架包:
Spring开发所需的jar包分为两个部分: Spring框架4个核心基础包和一个第三方依赖包。
spring-core-4.3.6.RELEASE.jar
包含Spring框架的核心工具类,Spring其它组件都要用到这个包里的类。
spring-beans-4.3.6.RELEASE.jar
所有应用都要用到的JAR包,它包含访问配置文件、创建和管理Bean以及进行控制反转或者依赖注入操作相关的所有类。
spring-context-4.3.6.RELEASE.jar
提供了在基础IoC功能上的扩展服务,还提供了许多企业级服务的支持
spring-expression-4.3.6.RELEASE.jar
定义了Spring的表达式语言。
在使用Spring开发时,除了要使用自带的JAR包外,Spring的核心容器还需要依赖一个第三方包commons.logging的JAR包。
6. ApplicationContext容器
通常在Java项目中,通常会通过ClassPathXmlApplicationContext类来实例化ApplicationContext容器的方式,而在Web项目中,ApplicationContext容器的实例化工作会交由Web服务器来完成。
7. SpringIOC应用示例核心代码:
main方法:
public class Test
public static void main(String[] args)
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) context.getBean("userService");
User user = new User();
user.setId("11111");
user.setName("zhangsan22222");
userService.addUser(user);
applicationContext.xml
<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-3.0.xsd">
<!--配置bean,配置后该类由spring管理-->
<bean id="userService" class="spring.ioc.service.UserService">
<!--依赖注入,配置当前类中相应的属性-->
<!-- <property>标签中的name就是UserService类中的userDao属性名,ref指下面<bean name="userDao"...>,这样其实是spring将UserDaoImp对象实例化并且调用UserService的setUserDao方法将UserDao注入 -->
<property name="userDao" ref="userDaoImp"></property>
</bean>
<!—配置bean ,,配置后该类由spring管理-->
<bean id="userDaoImp" class="spring.ioc.dao.imp.UserDaoImp"></bean>
</beans>
UserService.java
public class UserService
public UserDao userDao;
public UserDao getUserDao()
return userDao;
public void setUserDao(UserDao userDao)
this.userDao = userDao;
public void addUser(User user)
userDao.addUser(user);
UserDaoImp.java
public class UserDaoImp implements UserDao
public void addUser(User user)
System.out.println("添加了一个用户,姓名是"
+user.getName()+user.getId());
二、SpringJDBCTemplate
1. 在Spring的配置文件中配置JDBC
在Spring的配置文件中配置JDBC时,需要定义了三个Bean,分别是dataSource、jdbcTemplate和需要注入类的Bean。在定义jdbcTemplate时,需要将dataSource注入到jdbcTemplate中,而其他需要使用jdbcTemplate的Bean,也需要将jdbcTemplate注入到该Bean中,这样配置完成后,Spring JDBC就可以使用了。
2. JdbcTemplate类
Spring框架提供了JdbcTemplate类,该类是Spring框架数据抽象层的基础。JdbcTemplate类是Spring JDBC的核心类。JdbcTemplate的直接父类是抽象类JdbcAccessor,实现了接口JdbcOperations。
在JdbcTemplate类中,提供了大量的更新和查询数据库的方法,使用这些方法来操作数据库,其常用的方法包括execute()、update()和query()。
其中execute()方法能够完成执行SQL语句的功能,update()方法可以完成插入、更新和删除数据的操作,query()方法可以用来处理各种对数据库表的查询操作。
3. dataSource配置
dataSource配置,即JDBC连接数据库时需要4个基本属性,包括有driverClassName、url、username和password。
4. Spring 为JDBC提供了三个模板类供选择:
JdbcTemplate:最基本的Spring JDBC模板,支持简单的JDBC数据访问功能及基于索引参数的查询。使用占位符(?)绑定参数。
NamedParameterJdbcTemplate:该模板查询时可以将值以命名参数(:参数名)的形式绑定到SQL中,而不是使用简单的索引参数。
SimpleJdbcTemplate:该模板利用Java5的一些特性如自动装箱、泛型以及可变参数列表来简化JDBC模板的使用。
5. SpringJDBCTemplate应用示例核心代码:
Main方法:
public static void main( String[] args )
Test test = new Test();
UserAction userAction = test.getController();
test.testAdd(userAction);
// test.testFindNumbers(userAction);
// test.testFindNameById(userAction);
// test.testFindUser(userAction);
// test.testFindAll(userAction);
// test.testFindMapUser(userAction);
// test.testFindMapAll(userAction);
public UserAction getController()
ApplicationContext context =
new ClassPathXmlApplicationContext("config/applicationContext.xml");
UserAction userAction = (UserAction) context.getBean("userAction");
return userAction;
public void testAdd(UserAction userAction)
User user =new User();
user.setId(7);
user.setName("张三");
user.setAge(20);
userAction.add(user);
public void testFindNumbers(UserAction userAction)
int numbers = userAction.findNumbers();
System.out.println("findNumbers方法的查询结果:");
System.out.println("共有"+numbers+"个用户!");
public void testFindNameById(UserAction userAction)
String name = userAction.findNameById(1);
System.out.println("findNameById方法的查询结果:");
System.out.println("学号为1的学生的姓名为:"+name);
public void testFindUser(UserAction userAction)
System.out.println("findUser方法的查询结果:");
User user = userAction.findById(1);
System.out.println("id:"+user.getId()
+",name:"+user.getName()
+",age:"+user.getAge());
public void testFindAll(UserAction userAction)
List<User> users = userAction.findAll();
System.out.println("findAll方法的查询结果:");
for(User user:users)
System.out.println("id:"+user.getId()
+",name:"+user.getName()
+",age:"+user.getAge());
public void testFindMapUser(UserAction userAction)
System.out.println("findMapUser方法的查询结果:");
Map<String,Object> user = userAction.findMapById(1);
System.out.println("id:"+user.get("id")
+",name:"+user.get("name")
+",age:"+user.get("age"));
public void testFindMapAll(UserAction userAction)
System.out.println("findMapAll方法的查询结果:");
List<Map<String,Object>> users = userAction.findAllMap();
for(Map<String,Object> user:users)
System.out.println("id:"+user.get("id")
+",name:"+user.get("name")
+",age:"+user.get("age"));
applicationContext.xml
<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-3.0.xsd">
<bean id="userAction" class="action.UserAction">
<property name="userService" ref="userService" />
</bean>
<bean id="userService" class="service.UserService">
<property name="userDao" ref="userDao" />
</bean>
<bean id="dataSource1"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/spring" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<bean id="userDao" class="dao.UserDao">
<property name="jdbcTemplate" ref="jdbcTemplate1" />
<property name="npjt" ref="namedParameterJdbcTemplate" />
</bean>
<bean id="jdbcTemplate1" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource1" >
</property>
</bean>
<!-- NamedParameterJdbcTemplate配置 -->
<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="jdbcTemplate1" />
</bean>
</beans>
UserAction.java
public class UserAction
private UserService userService;
public UserService getUserService()
return userService;
public void setUserService(UserService userService)
this.userService = userService;
public void add(User user)
userService.add(user);
public String findNameById(int id)
return userService.findNameById(id);
public int findNumbers()
return userService.findNumbers();
public List<User> findAll()
return userService.findAll();
public User findById(int id)
return userService.findById(id);
public Map<String, Object> findMapById(int id)
return userService.findMapById(id);
public List<Map<String, Object>> findAllMap()
return userService.findAllMap();
UserService.java
public class UserService
private UserDao userDao;
public UserDao getUserDao()
return userDao;
public void setUserDao(UserDao userDao)
this.userDao = userDao;
public void add(User user)
userDao.add(user);
public String findNameById(int id)
return userDao.findNameById(id);
public int findNumbers()
return userDao.findNumbers();
public List<User> findAll()
return userDao.findAll();
public User findById(int id)
return userDao.findById(id);以上是关于软件体系结构 & 架构技术知识点总结(建议收藏)的主要内容,如果未能解决你的问题,请参考以下文章
[架构之路-90]:《软件架构设计:程序员向架构师转型必备》-1-总结