这几天好象发生了很多事情,好象有些憋气,感觉很多事都不顺心,竟然连跑路的想法都有了,也许这就是生活,大大小小总会有那么些的磨砺吧。不管怎么样,都归结自己不够强大。通过最近一段时间的学习,深刻的认识到以前所学知识的局限性。在使用Java的Spring框架的时候,认知到了一些新的编程思想,同时也对它强大的功能为之折服。对比之前编程方式,总结如下:
深入的了解面向对象编程
所谓面向对象变成,相信大家都知道,但我们在写代码是否有这样做呢?比如在实际项目中,我们会对数据库进行一些操作,如果我们对面向对象了解的不够深,就很有可能会局限于以数据库为中心的思路进行编程。拿数据库和实体类来说,它们分别对应物理模型和类图模型,而且之间应该是可以互相转换的,之前我一般会先设计好物理模型生成SQL语句创建数据库,然后在转换生成实体类。而使用Hibernate这个ORM框架,建好实体类后可反向创建数据库表,更精彩的是Java里可以使用注解来标识实体类或属性对应的数据库表或列,通过Spring接管代理后,通过XML配置可在初始化时把实体类同步到数据库表结构,甚至可根据实体对象的关系(如一对多、多对多)自动生成主外建关系,自动创建数据库。
Hibernate实体类(包含ManyToOne和ManyToMany关系,使用@代码注解代替繁杂的XML配置)
@NamedQueries( {
@NamedQuery(name = "Account.AccountByUuid[load]", query = "from Account as account where account.uuid=?", cacheable = false)})
@Entity
@Table(name = "FA_Account")
public class Account implements java.io.Serializable{
private static final long serialVersionUID = -6002028996236248727L;
private String uuid;
public void setUuid(String uuid) {
this.uuid = uuid;
}
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
@Column(name = "uuid", length = 32, updatable = false, columnDefinition = "VARCHAR(32)")
public String getUuid() {
return this.uuid;
}
@Length(max = 50,chinese = false)
private String name;
@Length(max = 50)
private String email;
//所属部门
private Department department;
//爱好
private Set<Loving> lovings;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "department_uuid")
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
@ManyToMany(targetEntity = Loving.class,fetch = FetchType.LAZY)
@JoinTable(name = "fa_account_loving", joinColumns = @JoinColumn(name = "account_uuid", referencedColumnName = "uuid"), inverseJoinColumns = @JoinColumn(name = "loving_uuid", referencedColumnName = "uuid"))
@Editor(value = CollectionEditor.class, params = {
@Param(name = "collectionClass", value = "java.util.HashSet"),
@Param(name = "elementClass", value = "com.fortuneage.entity.member.Loving") })
public Set<Loving> getLovings() {
return lovings;
}
public void setLovings(Set<Loving> lovings) {
this.lovings = lovings;
}
}
面向接口编程,依赖注入接口的实例
所谓接口,旨在提供一种约束规范,它要求实现类必须实现接口内所有方法或属性。我们常说的提供一个接口,但其实是提供一个接口的实例,只不过应该是以接口形式返回的,接口类里只有方法或属性的申明,所以我们不必要关注里面的实现,这样可促进各模块的松耦合。Spring里有一种称作控制反转(IOC)的技术,其中很多的地方就是使用接口,先通过容器配置管理一个bean实例(一般为singleton模式),然后再使用set方法或构造函数进行注入实例。
三层架构表现层(MVC)、业务逻辑层、持久层
传统的三层应该是表现层、业务逻辑层、持久层,根据项目需求的不同可能层次会更细分,但一般应该保证有这三层的明确分工,如下图:
但这里应该跟MVC三层区分开来,因为MVC应该是表现层一层,拿Struts来说,M(Model)应该是Action Form,V(View)应该是jsp页面,C(Control)应该是Struts Action。而如果使用Spring框架的话,当然也可以把Struts整合在一起,但Spring本身有提供DispatcherServlet控制分发器,可以直接把请求交给指定类处理,并可以根据不同URL参数响应不同方法,加上可以使用@代码注解,所以很方便实用。Spring同时还能整合Hibernate,构成目前JavaWeb开发领域最流行的框架SSH,Spring在其中冲当着控制管理的核心作用,详细流程如下图所示:
相比Java,.Net则是本身提供了一个强大的平台,在表现层,aspx页面则是属于View,aspx.cs相当于每个页面的控制层Control,依赖于.Net里强大的服务器控件,很容易在cs里控制aspx页面输出的内容,一般直接可以很方便通过控件ID获取值,因此View在到Control层前很少对Model进行填充转换,不过到持久化写入数据库还是依赖Model实体,因此Model层转换还是必须的,但目前我还没有用过.Net自动转换Model层的框架。
使用观察着模式、面向切面(AOP)编程