首页 > 代码库 > Spring

Spring

 

Spring的两个核心概念

  • IOC      (Inversion of Control 控制反转)
  • AOP     (Aspect Orient Programming 面向切面编程)

 

 

控制反转和依赖注入

     

       控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。

 

有一个实体操作接口和实现类

public interface UserDAO {    public void save(User user);}public class UserDAOImpl implements UserDAO {    public void save(User user) {                System.out.println("user saved!");    }}

 

有一个实体类

public class User {    private String username;    private String password;    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }}
User

 

有一个工具类

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;    }}

 

 由一个测试类

public class UserServiceTest {    @Test    public void testAdd() throws Exception {        ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");                        UserService service = (UserService)ctx.getBean("userService");                        User u = new User();        u.setUsername("zhangsan");        u.setPassword("zhangsan");        service.add(u);    }}

 

 

      

      从测试类本身来看,需要两个地方进行初始化

      service对象的初始化,以及add方法中使用的是UserDAO 的哪一个实现类是没有指定的(也就是内部的UserDao没有初始化)。

 

      但是加入了一个容器:

<beans >  <bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl">  </bean>      <bean id="userService" class="com.bjsxt.service.UserService">      <property name="userDAO" ref="u" />            </bean> </beans>

 

 

  • bean相当于new一个对象
  • ref相当于引入一个已经new的对象 

 

          之后,在spring框架下,这个程序是可以正常运行的。

 

          也就是说把具体对象的初始化交给这个容器来完成。这个就是控制反转的意义

          控制反转意思就是说以前可以在类中控制具体的初始化,现在交给由容器完成

          具体的类 从控制实现到控制抽象(接口),从实现具体的东西,到实现抽象的东西

          也就是说UserService 类里面不需要初始化DAO对象

          UserServiceTest 类里面也不需要初始化UserService对象

           这些都交给容器来完成

 

          service.add(u)    具体add的具体实现依赖于容器注入给的DAO对象,这个就是依赖注入

 

注入类型

 

主要有两种

  • setter注入
  • 构造方法注入

 

        setter注入就是使用set方法

 

public class SimpleMovieLister {    // the SimpleMovieLister has a dependency on the MovieFinder    private MovieFinder movieFinder;    // a setter method so that the Spring container can inject a MovieFinder    public void setMovieFinder(MovieFinder movieFinder) {        this.movieFinder = movieFinder;    }    // business logic that actually uses the injected MovieFinder is omitted...}

 

 

       bean.xml不变

 

       构造方法注入用的很少

<bean id="exampleBean" class="examples.ExampleBean">    <constructor-arg type="int" value="7500000"/>    <constructor-arg type="java.lang.String" value="42"/></bean>

 

name和id

  <bean name="u" class="com.bjsxt.dao.impl.UserDAOImpl">  </bean>

 

        这两个基本一致,没啥区别

 

Spring