spring采用了四种策略来简化java开发的复杂性
1.基于POJO的轻量级和最小侵入性编程
2.通过依赖注入和面向接口编程实现松耦合
3.基于切面和惯例进行声明事编程
4.通过切面和模板减少样版编码
基于POJO的轻量级和最小侵入性编程
在spring之前的很多框架中,都是通过强迫应用继承和接口实现来实现功能,导致应用程序和框架绑死;例如:EJB2中的无状态会话bean。
Spring在创建POJO时,避免因自身API而弄乱你的应用代码。Spring不会强迫你实现spring规范的接口或者继承spring规范的类。在基于spring构建的应用程序中,它几乎没有任何痕迹表明使用了spring,最多就是使用了spring的注解。
举例清单1.1.1
pachage nui.honest.spring.demo.jopo;
@RestController
public class HelloWord {
@ReqestMapping("/hello")
public String test() {
return “hello world!”;
}
}
综上,就是spring在其实现时,尽量减少自身API对你编码的影响。
通过依赖注入和面向接口编程实现松耦合
使用依赖注入(DI)的原因:任何一个应用程序都是多个类相互协作来实现其功能的;按照传统做法,每个对象来管理与自己写作对象的应用实现,这样做耦合度高,可伸缩性差。
举例清单1.1.2:
pachage nui.honest.spring.demo.di;
/**
紧耦合的代码
/
public class NonDIDemo {
private RelationDemo relationDemo;
public NonDIDemo() {
this.relationDemo = new RelationDemo ();
}
public void test() {
relationDemo.test();
}
}
pachage nui.honest.spring.demo.di;
/*
松耦合代码
/
public class NonDIDemo {
private RelationDemo relationDemo;
//构造器注入
public NonDIDemo(RelationDemo relationDemo) {
this.relationDemo =relationDemo;
}
//方法注入,一般使用set方法注入
public void setRelationDemo(RelationDemo relationDemo) {
this.relationDemo =relationDemo;
}
public void test() {
relationDemo.test();
}
}
其次,是使用实现接口和继承父类,实现面向对象的的多态:一个方法根据不同的实现有多种功能。
面向切面编程,就是把分散的功能分离出来形成可重用的组件。
举例清单1.1.3
package nui.honest.spring.demo.aop;
/*
-
Created by 15692 on 2019/2/17.
*/
public class Minstrel {public void singBeforeQuest() {
System.out.println(“Quest before singing thing”);
}public void singAfterQuest() {
System.out.println(“Quest after singing thing”);
}
}
配置文件
通过模板减少样版编码
通过模板代码,就是简化代码,使得一个类或者方法只做一件事,减少上帝函数的出现,易于重复使用和扩展。
举例清单1.1.3
package nui.honest.spring.demo.jdbc;
import java.sql.*;
import nui.honest.spring.demo.jdbc.vo.UserBeanVO;
import org.springframework.stereotype.Component;
import javax.jws.soap.SOAPBinding;
/**
*基于java的jdbc的数据库连接
* Created by 15692 on 2019/2/17
*/
@Component("jdbcTemplate")
public class JDBCTemplate {
public Connection getConn() {
Connection conn = null;
try {
String URL = "jdbc:mysql://127.0.0.1:3306/springdemo?useUnicode=true&characterEncoding=utf-8";
String USER = "root";
String PASSWORD = "passwd";
//1.加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
//2.获得数据库链接
conn = DriverManager.getConnection(URL, USER, PASSWORD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
public UserBeanVO getUser() {
UserBeanVO userBeanVO = new UserBeanVO();
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
conn = getConn();
//3.通过数据库的连接操作数据库,实现增删改查(使用Statement类)
st = conn.createStatement();
rs = st.executeQuery("select id,user_name as userName,user_passwd as userPasswd,creatime,remark from user");
//4.处理数据库的返回结果(使用ResultSet类)
while (rs.next()) {
userBeanVO.setId(rs.getInt("id"));
userBeanVO.setUserName(rs.getString("userName"));
userBeanVO.setUserPasswd(rs.getString("userPasswd"));
userBeanVO.setCreatime(rs.getDate("creatime"));
userBeanVO.setRemark(rs.getString("remark"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (null != conn) {
conn.close();
}
if (null != st) {
conn.close();
}
if (null != rs) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return userBeanVO;
}
}
package nui.honest.spring.demo.jdbc;
import nui.honest.spring.demo.jdbc.vo.UserBeanVO;
import nui.honest.spring.demo.jdbc.vo.UserRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.stereotype.Component;
/**
*基于spring的数据库查询
* Created by 15692 on 2019/2/17.
*/
@Component
public class SpringTemplate {
public JdbcTemplate getJdbcTemplate() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/springdemo?useUnicode=true&characterEncoding=utf-8");
dataSource.setUsername("root");
dataSource.setPassword("passwd");
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
return jdbcTemplate;
}
public UserBeanVO getUser() {
UserBeanVO userBeanVO = null;
JdbcTemplate jdbcTemplate = getJdbcTemplate();
String sql = "select id,user_name as userName,user_passwd as userPasswd,creatime,remark from user";
userBeanVO = jdbcTemplate.queryForObject(sql, new UserRowMapper());
return userBeanVO;
}
}
从清单可以看出,spring模块化的代码明显简便了很多,如果将 jdbcTemplate作为spring的配置,查询数据库的操作类将只做一件事。