我是如何学习Spring的(一)

简介

Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。

Spring优点

方便解耦,简化开发

Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理

AOP编程的支持

Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能

声明式事务的支持

只需要通过配置就可以完成对事务的管理,而无需手动编程

方便程序的测试

Spring对Junit4支持,可以通过注解方便的测试Spring程序

方便集成各种优秀框架

Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持

降低JavaEE API的使用难度

Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低

基本概念

Dependency 依赖:一个类的实现需要用到另一个类。
Injection 注入:将一个类添加到另一个类中。
DI (Dependency Injection) 依赖注入:A类依赖B类,A类提供set接口,当需要B类时,通过接口,将B类传递给A类。
IOC (Inversion of Control) 控制反转:由以前的A类创建B类,转变为由第三方IOC容器(Spring)创建B类。A类不能直接创建B类,A类通过第三方IOC容器获取B类。

传统方式

传统方式创建 Model、Dao、DaoImpl、Service

  • User Model

    1
    2
    3
    4
    5
    public class User {
    private String username;
    private String password;
    //省略get、set方法
    }
  • User Dao

    1
    2
    3
    public interface UserDAO {
    public void save(User user);
    }
  • User DaoImpl

    1
    2
    3
    4
    5
    6
    public class UserDAOImpl implements UserDAO {
    public void save(User user) {

    System.out.println("user saved!");
    }
    }
  • User Service

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class UserService {
    private UserDAO userDAO;
    public void add(User user) {
    userDAO.save(user);
    }
    public UserDAO getUserDAO() {
    return userDAO;
    }
    public void setUserDAO(UserDAO userDAO) {
    this.userDAO = userDAO;
    }
    }
1
2
3
//创建Service层,Service层调用DaoImpl的add()方法,add()调用Dao层的save()方法。
Service service= new Service();
service.add(u);

IOC方式

beans.xml配置一个bean

<beans>
    <bean id="u" class="com.dao.impl.UserDAOImpl" />          //配置一个简单类
    <bean id="userService" class="com.service.UserService" >  //配置一个userService
        <property name="userDAO" bean="u"/>     //为userService通过property配置一个setUserDao()方法,当调用setUserDao()方法时,将u这个bean传进去(注入)。
    </bean>
</beans>
``` bash
//IOC方式与传统方式得到的结果都一样,在控制台输出user saved!因为都执行了save(User)方法。
public class UserServiceTest {
    @Test
    public void testAdd() throws Exception {
        //1 加载配置文件,默认为beans.xml
        BeanFactory applicationContext = new ClassPathXmlApplicationContext(); 
        UserService service = (UserService)applicationContext.getBean("userService");    

        User u = new User();
        u.setUsername("zhangsan");
        u.setPassword("zhangsan");
        service.add(u);
    }
}

##