【Spring学习】IoC、DI、AOP入门学习

新建一个普通的java项目,添加spring功能(3.x),不要使用MyEclipse提供的jar包,自己手动添加需要的jar包(commons-logging.jar、spring.jar);

IoC控制反转:

这里写图片描述

Hello.java

package domain;

public class Hello {

    private String msg;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String toString(){
        return "hello " + msg;
    }
}

applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

    <bean id="hello" class="domain.Hello">
        <property name="msg" value="lmb"></property><!-- 通过Hello实体类中的setMsg()方法并msg成员变量的值注入 -->
    </bean> 

</beans>

TestHello.java:

package web;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import domain.Hello;

public class TestHello {

    /**
     * 注意体会控制反转IoC的思想
     */
    public static void main(String[] args) {

//*****通过new来创建对象**************************
        Hello hello1=new Hello();
        System.out.println(hello1); //hello null

//****通过spring框架来创建对象****************************
        ApplicationContext applicationContext=new 
                ClassPathXmlApplicationContext("applicationContext.xml");//加载配置文件
        Hello hello2=(Hello)applicationContext.getBean("hello");
        //利用applicationContext得到bean,注意这里的"hello"与applicationContext.xml中<bean>配置中的id对应
        System.out.println(hello2);//hello lmb
        //我们在applicationContext.xml配置文件中的<bean>在的<property>中为Hello实体类中的msg属性配置了一个"lmb"的值

    }

}
总结:

普通创建对象时,我们通过new来控制对象的生命周期,使用IoC之后,控制反转IoC的思想就是:把管理对象的生命周期的控制权交给spring框架,使用spring框架来构建对象,由spring框架来管理对象生命周期的开始和结束。

DI依赖注入:

这里写图片描述

TestUser.java:

package web;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import Manager.UserManager;
import domain.User;

public class TestUser {

    /**
     * 注意体会依赖注入DI的思想
     */
    public static void main(String[] args) {

        User user=new User();//该User对象是从前台页面获取的

        ApplicationContext applicationContext=
                new ClassPathXmlApplicationContext("applicationContext.xml");
        UserManager userManager=(UserManager)applicationContext.getBean("userManager");
        //通过applicationContext.xml配置文件获取UserManager对象和它的实现,同时也就能获取到UserDao对象和它的实现
        //控制层调用业务逻辑层处理业务逻辑
        userManager.addUser(user); //JDBC insert User.......
    }
}

UserManagerImpl.java

package Manager;

import dao.UserDao;
import domain.User;

public class UserManagerImpl implements UserManager {

    private UserDao userDao;

    public UserDao getUserDao() {
        return userDao;
    }
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void addUser(User user) {
        // 业务逻辑层调用持久层进行数据持久化处理

        //使用普通的方法是用new的方法构建一个UserDao对象
        //UserDao userDao=new UserDaoImpl();
        //注意这里没有给出UserDao的实现,UserDao的实现是通过配置文件注入的
        userDao.insertUser(user);
    }

}

UserDaoImpl.java

package dao;

import domain.User;

public class UserDaoImpl implements UserDao {

    public void insertUser(User user) {
        //持久层使用JDBC的方式将数据持久化到数据库中,这里用一个打印语句代替
        System.out.println("JDBC insert User.......");
    }

}

applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

    <!-- UserDaoImpl中没有需要注入的属性 -->
    <bean id="userDao" class="dao.UserDaoImpl"></bean>

    <!-- UserManagerImpl中需要将userDao的实现注入 -->
    <bean id="userManager" class="Manager.UserManagerImpl">
        <property name="userDao" ref="userDao"></property>
    </bean>

</beans>
总结:

在UserManagerImpl.java中我们只声明了UserDao对象,并没有给出它的实现,它的实现是通过applicationContext.xml配置文件中UserManager的配置依赖注入的。

AOP面向切面编程

在上面项目的基础上再添加一个UserDaoHibernateImpl.java

这里写图片描述

UserDaoHibernateImpl.java:

package dao;
import domain.User;

public class UserDaoHibernateImpl implements UserDao{

    public void insertUser(User user) {
        //持久层使用Hibernate的方式将数据持久化到数据库中,这里用一个打印语句代替
        System.out.println("Hibernate insert User.....");
    }
}

修改applicationContext.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

    <!-- UserDaoImpl中没有需要注入的属性 -->
    <bean id="userDao" class="dao.UserDaoImpl"></bean>

    <bean id="userDaoHibernate" class="dao.UserDaoHibernateImpl"></bean>

    <!-- UserManagerImpl中需要将userDao的实现注入 -->
    <bean id="userManager" class="Manager.UserManagerImpl">
        <!-- <property name="userDao" ref="userDao"></property> -->
        <property name="userDao" ref="userDaoHibernate"></property>
    </bean>

</beans>

TestUser.java会输出Hibernate insert User…..

总结:

开闭原则:对代码的修改关闭,对代码的添加打开;

spring有解耦的作用,需要面向接口编程,在本例中UserDaoImpl和UserDaoHibernateImpl都实现了UserDao这个接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值