技术架构演进流程(java)(代码片段)

知青先生 知青先生     2023-02-18     365

关键词:

目录

简介

这里用的都是市面上通用的技术架构风格,而每个公司都有自己的组件和架构,可以根据实际情况与业务场景不同去进行变通、技术的底层逻辑都是可以借鉴的。

三层架构:

界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。区分层次的目的即为了“高内聚低耦合”的思想。
​​​​

Servlet项目

1、静态资源需要放在WebContent文件下,不应该在web-inf文件下

项目结构:

底层数据连接:
/**
* 数据库连接
* @author 明
*
*/
public class ConnDB 
private static String driver;
private static String url;
private static String user;
private static String pwd;
/**
* 加载连接条件
*/
static
try 
  Properties properties=new Properties();
  InputStream inputStream=ConnDB.class.getClassLoader().getResourceAsStream("db.properties");
  properties.load(inputStream);
  driver = properties.getProperty("driver");
  url = properties.getProperty("url");
  user = properties.getProperty("user");
  pwd = properties.getProperty("password");
  Class.forName(driver);
 catch (IOException e) 
  // TODO Auto-generated catch block
e.printStackTrace();
 catch (ClassNotFoundException e) 
// TODO Auto-generated catch block
  e.printStackTrace();


/**
* 数据库连接
* @return
*/
public static Connection getConnection()
  Connection conn=null;
try 
  conn=DriverManager.getConnection(url, user, pwd);
 catch (SQLException e) 
  // TODO Auto-generated catch block
  e.printStackTrace();

  return conn;

/**
* 关闭连接属性
*/
public static void cose(ResultSet resultSet,PreparedStatement preparedStatement,Connection conn)

if(resultSet!=null)
try 
  resultSet.close();
 catch (SQLException e) 
  // TODO Auto-generated catch block
  e.printStackTrace();


if(preparedStatement!=null)
try 
  preparedStatement.close();
 catch (SQLException e) 
// TODO Auto-generated catch block
  e.printStackTrace();


if(conn!=null)
try 
  conn.close();
 catch (SQLException e) 
  // TODO Auto-generated catch block
  e.printStackTrace();




数据处理使用工厂方式:增强通用性,会牺牲点性能

案列:

@Override
public Boolean loginUser(String userName, String userPassword) 
  boolean falg = false;
  Connection getconn = connDB();
String sql = "select * from user u where u.user_name=? and u.user_password=?";
try 
  preparedStatement = getconn.prepareStatement(sql);
  preparedStatement.setString(1, userName);
  preparedStatement.setString(2, userPassword);
  resultSet = preparedStatement.executeQuery();
  while (resultSet.next()) 
    falg = true;
  
 catch (SQLException e) 
e.printStackTrace();
finally //回收资源
  ConnectionDBUtil.geetConnClose(resultSet,preparedStatement,connDB());

return falg;

数据业务处理:


四:前后台数据交互:

MVC设计:

小型架构目录

├──pom.xml├──main
| ├──java
| | └──com
| | └──web
| | ├── core
| | | ├── controller //控制器包
| | | ├── entity //POJO包
| | | ├── mapper //Mapper接口包
| | | ├── service //Service接口包
| | | └── serviceImpl //service实现类包
| | └──util //工具包
| ├── resources //资源文件夹(配置文件)
| | ├──applicationContext.xml //Spring配置文件
| | ├──dbconfig.properties //数据库配置文件
| | ├──log4j.properties //log4j配置文件
| | ├──mybatis-config.xml //mybatis配置文件
| | ├──spring-mvc.xml //springMvc配置文件
| | ├──spring-mybatis.xml //spring-mybatis整合配置
| | └── mapping //mapper.xml文件夹
| | └── StudentMapper.xml
| └── webapp ///web应用部署根目录
| ├──login.html //登录页
| ├──pages //jsp文件将爱
| | └── studentList.jsp
| ├──static //静态资源文件夹
| | ├──css
| | | └── login.css
| | ├──images
| | | ├──login-img.png
| | | └── login_logo.png
| | └── js
| | └── JQuery.js
| └── WEB-INF //
| └── web.xml└──test
├── java
├── resources



SSH项目(spring+struts+hibernate)

常用注解:

Hibernate框架的

Hibernate的注解主要用在持久化类那一块:

@Entity

指定当前类是实体类。
@Entity
public class User() 
private Integer id;
private String name;

@Table

指定实体类和数据库表之间的对应关系。
##### 属性:


name:指定数据库表的名称
@Entity
@Table(name="t_user")
public class User() 
private Integer id;
private String name;

@Id
指定当前字段是主键。
@Entity
@Table(name="t_user")
public class User() 
@Id
private Integer id;
private String name;

@GeneratedValue


指定主键的生成方式。
##### 属性:
strategy :指定主键生成策略。
JPA 提供的四种标准用法为 TABLE,SEQUENCE,IDENTITY,AUTO。
@Entity
@Table(name="t_user")
public class User() 
@Id
@GeneratedValue(strategy = IDENTITY)
private Integer id;
private String name;

@Column


指定实体类属性和数据库表字段之间的对应关系
##### 属性:


name:指定数据库表的列名称。
unique:是否唯一
nullable:是否可以为空
inserttable:是否可以插入
updateable:是否可以更新
@Entity
@Table(name="t_user")
public class User() 
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "user_id")
private Integer id;

@Column(name = "user_name")
private String name;

@Temporal

设置日期时间
1
方式一:@Temporal(TemporalType.DATE)映射为日期 // birthday date (只有日期)

方式二:@Temporal(TemporalType.TIME)映射为日期 // birthday time (是有时间)

方式三:@Temporal(TemporalType.TIMESTAMP)映射为日期 //birthday datetime (日期+时间)


@Temporal(TemporalType.DATE)
private Date birthday;
@Lob
作用:设置大数据类型



方式一:
@Lob
private String text; //text longtext
方式二:

@Lob
private byte[] image; // image longblob
@Enumerated
作用:设置枚举类型

方式一:

/** 保存字符串到数据库 */
@Enumerated(EnumType.STRING)
private Role role;
方式二:

/** 保存整数到数据库 */
@Enumerated(EnumType.ORDINAL)
private Role role;
上面定义的枚举:Role

/** 角色 */
public enum Role 
游客, 会员, 管理员




使用:
User user = new User();
user.setRole(Role.管理员);
@Transient
作用:修饰的字段不会被持久化

@Transient
private String temp;
这样也可以:
private transient String temp;
一对多涉及的注解:

@OneToMany:
作用:建立一对多的关系映射
属性:
targetEntityClass:指定多的多方的类的字节码
mappedBy:指定从表实体类中引用主表对象的名称。
cascade:指定要使用的级联操作
fetch:指定是否采用延迟加载
orphanRemoval:是否使用孤儿删除
@ManyToOne
作用:建立多对一的关系
属性:
targetEntityClass:指定一的一方实体类字节码
cascade:指定要使用的级联操作
fetch:指定是否采用延迟加载
optional:关联是否可选。如果设置为false,则必须始终存在非空关系。
@JoinColumn
作用:用于定义主键字段和外键字段的对应关系。
属性:
name:指定外键字段的名称
referencedColumnName:指定引用主表的主键字段名称
unique:是否唯一。默认值不唯一
nullable:是否允许为空。默认值允许。
insertable:是否允许插入。默认值允许。
updatable:是否允许更新。默认值允许。
columnDefinition:列的定义信息。
多对多涉及的注解:

@ManyToMany
作用:用于映射多对多关系
属性:
cascade:配置级联操作。
fetch:配置是否采用延迟加载。
targetEntity:配置目标的实体类。映射多对多的时候不用写。
@JoinTable
作用:针对中间表的配置
属性:
nam:配置中间表的名称
joinColumns:中间表的外键字段关联当前实体类所对应表的主键字段 inverseJoinColumn:中间表的外键字段关联对方表的主键字段

@JoinColumn
作用:用于定义主键字段和外键字段的对应关系。
属性:
name:指定外键字段的名称
referencedColumnName:指定引用主表的主键字段名称
unique:是否唯一。默认值不唯一
nullable:是否允许为空。默认值允许。
insertable:是否允许插入。默认值允许。
updatable:是否允许更新。默认值允许。
columnDefinition:列的定义信息。
Struts2框架的
@NameSpace

出现的位置: 它只能出现在 package 上或者 Action 类上。 一般情况下都是写在 Action 类上。
作用: 指定当前 Action 中所有动作方法的名称空间。
属性:
value: 指定名称空间的名称。写法和 xml 配置时一致。 不指定的话,默认名称空间是""@ParentPackage

出现的位置: 它只能出现在 package 上或者 Action 类上。 一般情况下都是写在 Action 类上。
作用: 指定当前动作类所在包的父包。由于我们已经是在类中配置了,所以无需在指定包名了。
属性:
value: 指定父包的名称。
@Action

出现的位置: 它只能出现在 Action 类上或者动作方法上。 一般情况下都是写在动作方法上。
作用: 指定当前动作方法的动作名称。 也就是 xml 配置时 action 标签的 name 属性。
属性:
value: 指定动作名称。
results[]: 它是一个数组,数据类型是注解。用于指定结果视图。此属性可以没有,当没有该属性时,表示不返回任何结果视图。即使用 response 输出响应正文。
interceptorRefs[]: 它是一个数组,数据类型是注解。用于指定引用的拦截器。
@Result

出现的位置: 它可以出现在动作类上,也可以出现在 Action 注解中。
作用: 出现在类上,表示当前动作类中的所有动作方法都可以用此视图。出现在 Action 注解中,表示当前 Action 可用此视图。
属性:
name: 指定逻辑结果视图名称。
type: 指定前往视图的方式。 例如:请求转发,重定向,重定向到另外的动作。
location: 指定前往的地址。可以是一个页面,也可以是一个动作。
@Results

出现的位置: 它可以出现在动作类上,也可以出现在 Action 注解中。
作用: 用于配置多个结果视图。
属性:
value: 它是一个数组,数据类型是 result 注解。
@InterceptorRef

出现的位置: 它可以出现在动作类上或者 Action 注解中。
作用: 用于配置要引用的拦截器或者拦截器栈
属性:
value: 用于指定拦截器或者拦截器栈

Spring框架的
1、IOC的注解
@Component :创建对象

@Controller

把视图层类交给Spring管理
@Controller
public class UserAction() 


@Service

把业务层类交给Spring管理
@Service
public class UserService() 


@Repository

把持久层类交给Spring管理
@Repository
public class UserDao() 


@Autowired

根据类型自动注入对象
@Autowired
private UserDao userDao;
@Qualifier

与上面的Autowired一起用,目的根据id获取对象
//例:把持久化层交给Spring管理,并在业务层通过id注入持久化层对象
@Repository("userDao")
public class UserDao() 

@Service
public class UserService() 
@Autowired
@Qualifier("userDao")
private UserDao userDao;

@Resource

可以根据类型注入,也可以根据id装配,name属性就是bean的id
@Resource(name="userDao")
private UserDao userDao;
@Value

注入基本类型和字符串类型
@Scope

单例与多例的配置,默认是单例
singleton(单例)prototype(多例);request session
//例:Action是多例的,所以应配置对应的属性,而dao层是单例的,不用配置
@Controller
@Scope(value="prototype")
public class UserAction() 



@Repository
public class UserDao() 


@Configuration :

定义配置类,用于替换spring中的xml文件的
@Configuration
public class SpringConfiguration 


@ComponentScan:

开启注解扫描
@Configuration
//@ComponentScan(basePackages="cn")
//@ComponentScan(value="cn")
@ComponentScan("cn")//value:指定扫描的包【推荐,因为可以不写】
public class SpringConfiguration 


@PropertySource

指定的配置文件
@Configuration
@PropertySource(value="classpath:/config/jdbc.properties")
public class SpringConfiguration 
/**
* 告诉spring框架开启el表达式
* 在4.3版本以前都需要这个占位符类
* 在4.3版本之后以下代码可以省略不写
*/
@Bean
public PropertySourcesPlaceholderConfigurer createPSPC()
return new PropertySourcesPlaceholderConfigurer();


@Bean

用在方法上面,创建对象的,根据方法的返回类型
@Component
public class JdbcConfig 

@Bean(name="dataSource")//相当于:<bean id="ds" class="com.mchange.v2.c3p0.ComboPooledDataSource" />
public DataSource createDataSource()
ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
try 
comboPooledDataSource.setDriverClass("com.mysql.jdbc.Driver");
 catch (Exception e) 
e.printStackTrace();

comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/springIOC");
comboPooledDataSource.setUser("root");
comboPooledDataSource.setPassword("root");
return comboPooledDataSource;

@Bean(name="queryRunner")
public QueryRunner createQr(@Qualifier(value="dataSource") DataSource dataSource)
return new QueryRunner(dataSource);


@Import

导入其他的配置类,交给Spring管理
1
@Configuration
@Import(value=JdbcConfig.class)
public class SpringConfiguration 

2、AOP的常用注解
AOP : 全称是Aspect Oriented Programming: 面向切面编程
需要在Spring的主配置文件中添加以下标签。开启aop注解的

intelcpu微架构的演进与发展(代码片段)

...11-2122:10author:gatiemetags:-linux-architecture-intel-pipelinecategories:-技术积累thumbnail:blogexcerpt:IntelCPU微架构的演进与发展本作品采用知识共享署名-非商业性使用-相同方式共享4.0国际许可协议进行许可,转载请注明出处,谢谢 查看详情

分布式系统架构演进

技术为业务而生,随着业务不断的壮大,系统会遇到各种各样的瓶颈,为了解决这些瓶颈问题,催生了不同的架构。下面,我讲解一下一般大型分布式系统的架构演进。上图是阿里技术演进图,绝大多数系统基本上会按照这个流... 查看详情

intelcpu微架构的演进与发展(代码片段)

...11-2122:10author:gatiemetags:-linux-architecture-intel-pipelinecategories:-技术积累thumbnail:blogexcerpt:IntelCPU微架构的演进与发展本作品采用知识共享署名-非商业性使用-相同方式共享4.0国际许可协议进行许可,转载请注明出处,谢谢合作因本人技术... 查看详情

intelcpu微架构的演进与发展(代码片段)

...11-2122:10author:gatiemetags:-linux-architecture-intel-pipelinecategories:-技术积累thumbnail:blogexcerpt:IntelCPU微架构的演进与发展本作品采用知识共享署名-非商业性使用-相同方式共享4.0国际许可协议进行许可,转载请注明出处,谢谢合作因本人技术... 查看详情

intelcpu微架构的演进与发展(代码片段)

...11-2122:10author:gatiemetags:-linux-architecture-intel-pipelinecategories:-技术积累thumbnail:blogexcerpt:IntelCPU微架构的演进与发展本作品采用知识共享署名-非商业性使用-相同方式共享4.0国际许可协议进行许可,转载请注明出处,谢谢合作因本人技术... 查看详情

大型网站技术架构的演进

最近我在阅读2本关于大型网站架构的书:《大型网站技术架构——核心原理与案例分析》李智慧、《大型网站系统与Java中间件实践》曾宪杰。我期望从这些书中学习到大型网站是如何做架构的,这个过程会遇到什么问题。当看... 查看详情

图解微服务架构演进(代码片段)

图解服务化架构演进前言来自dubbo的用户手册中的一句话:随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保... 查看详情

网易严选app工程架构演进(代码片段)

一、前言互联网技术发展到今天,移动互联网仍然是一个重要的战略核心,APP也仍然是绝大多数互联网企业用户获客留存的核心渠道。根据2021年移动应用趋势报告[1],移动应用程序的受欢迎程度仍在持续增长,应... 查看详情

图解微服务架构演进(代码片段)

...心就是对应用做服务化改造,服务话改造使用的核心技术架构就是分布式服务框架。其实这篇是概念上的总结,技术概念软文,纪录此文让自己更明白什么是微服务化架构。服务化架构演进请看下图,也来自dubbo... 查看详情

vivo商城前端架构升级-总览篇(代码片段)

【背景】一年前vivo商城还是以Java为技术核心,前后台一起,Java既要负责服务、数据库,也要负责页面的渲染。在早期这种开发模式也能够很好的运行。然而随着业务迭代的加快,前端技术的发展,这种开发模式的弊端越来越明... 查看详情

10wqps超高并发api网关架构演进之路(代码片段)

...(目的,整合规范外部调用,如短信平台mqtt等)我在做整理技术方案,但是没有什么思路。老师,这方面有没有什么参考资料呀(2)高并发业务出口网关,如何做系统架构?(3)等等等等......刚刚,在尼恩的社群(50+)中,有小伙伴... 查看详情

软件架构演变+zookeeper--->安装配置+数据模型+常用命令+与java交互(代码片段)

...做相应的处理做到集群(10~1000)③.不同的项目采用不同的技术实现.缺点:①.全部的功能都集中在一个项目中完成,对于大型项目来说,开发难度高,不容易开发及扩展和维护.②.集群扩展有瓶颈②.项目与项目之间存在数据冗余,耦合度... 查看详情

技术架构演进

网站技术架构为什么会演进我个人总结出来我们的技术架构演进的两种驱动力,驱动着我们为什么演进网站的技术架构:1.内在驱动力:我们期望把当前的业务做得更好,开发更多新业务2.外在驱动力:用户量的上升、用户种类... 查看详情

实时数仓演进&方案对比选型落地(代码片段)

...原创内容公众号【作者介绍】王磊,阿里云MVP,华院计算技术总监。 著有:《图解Spark大数据快速分析实战》;《offer来了:Java面试核心知识点精讲(原理篇)》;《offer来了:Java面试核心知识点精讲(架构篇)》。 &nbs... 查看详情

各大互联网公司架构演进之路汇总

...800阅读时间:2分钟大型网站架构演化历程大型网站架构技术一览支付宝和蚂蚁花呗的技术架构及实践支付宝的高可用与容灾架构演进余额宝技术架构及演进淘宝数据魔方技术架构解析淘宝技术发展历程和架构经验分享淘宝架构... 查看详情

《大型网站技术架构演进与性能优化》——第五章:应用程序优化:代码级优化

             第5章是精华。。。    查看详情

架构的演进,阿里资深java工程师表述架构的腐化之谜

前言新技术层出不穷。过去十年时间里,我们经历了许多激动人心的新技术,包括那些新的框架、语言、平台、编程模型等等。这些新技术极大地改善了开发人员的工作环境,缩短了产品和项目的面世时间。然而作为在软件行业... 查看详情

宜信开源|分布式任务调度平台sia-task的架构设计与运行流程(代码片段)

...常需要一些任务调度系统来帮助解决问题。随着微服务化架构的逐步演进,单体架构逐渐演变为分布式、微服务架构。在此背景下,很多原先的任务调度平台已经不能满足业务系统的需求,于是出现了一些基于分布式的任务调度... 查看详情