第1章.Spring的应用

一、Spring 的两种核心容器:BeanFactory 和 ApplicationContext(都通过xml加载Bean的)

二、通过ApplicationContext实例化:

1.通过ClassPathXmlApplicaationContext创建

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);

configLocation参数用于指定Spring配置文件的名称和位置。

如果其值为“applicationContext.xml”,则Spring会去类路径中查找名为applicationContext.xml的配置文件

Spring配置文件名称可自定义,一般开发都定为applicationContext.xml(有时也定为beans.xml)

所以常用语句就是:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

表示初始化spring容器,加载配置文件。

2.通过FileSystemXmlApplicationContext创建

ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation);

不是从类路径中读取配置文件,而是通过参数指定配置文件的位置,例如:"D:/workspaces/applicationContext.xml",如果参数中写的不是绝对路径,调用时默认用绝对路径。灵活性差,不推荐。

然后,xml文件是啥?类似这种东西,除了<bean>,其他照抄,用多了自然就会懂。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://www.springframework.org/schema/beans 
 5     http://www.springframework.org/schema/beans/spring-beans-4.3.xsd"> 
6 <!-- 将指定类配置给Spring,让Spring创建其对象的实例 --> 7 <bean id="userDao22" class="com.itheima.ioc.UserDaoImpl" /> 8 9 <!--添加一个id为userService的实例 --> 10 <bean id="userService" class="com.itheima.ioc.UserServiceImpl"> 11 <!-- 将id为userDao22的Bean实例注入到userService实例中,name属性表示Bean实例中的相应属性名,ref属性用于指定其属性值 --> 12 <property name="userDao" ref="userDao22" /> 13 </bean> 14 15 </beans>

通过容器获取实例:

类名 + 对象名  = (强转类名)+ applicationContext.getBean(String name/id);

比如:UserService userService = (UserService) applicationContext.getBean("userService");

三、控制反转和依赖注入

1.控制反转(IoC,Inversion of Control):说白了就是不用new,用容器获取对象,把创建和查找依赖对象的控制权交给了容器。

2.依赖注入(DI,Dependency Injection):使用Spring框架创建对象时,动态地将其所依赖的对象注入Bean组件中,两种方法。(1)属性setter方法注入,指Spring容器使用setter方法注入被依赖的实例。通过调用无参构造器或无参静态工厂方法实例化Bean后,调用该Bean的setter方法。(2)构造方法注入:指Spring容器使用构造方法注入被依赖的实例。

书上多少个名字重合的,都不知道哪个匹配哪个,现有以下几个接口和实现接口的类

package com.itheima.ioc;
public interface UserDao {
    public void say();
}
package com.itheima.ioc;
public class UserDaoImpl implements UserDao {
    public void say() {
        System.out.println("userDao say hello World 222!");
    }
}
package com.itheima.ioc;
public interface UserService {
    public void say();
}
package com.itheima.ioc;
public class UserServiceImpl implements UserService {
    // 声明UserDao属性
    private UserDao userDao44;
    // 添加UserDao属性的setter方法,用于实现依赖注入
    public void setUserDao(UserDao userDao) {
        this.userDao44 = userDao;
    }
    // 实现的接口中方法
    public void say() {
        //调用userDao中的say()方法,并执行输出语句
        this.userDao44.say();
        System.out.println("userService say hello World !");
    }
}

测试IoC,很简单地调用say方法,本章看不出什么门道。

package com.itheima.ioc;
import org.springframework.context.ApplicationContext;
import 
    org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestIoC {
    public static void main(String[] args) {
        //1.初始化spring容器,加载配置文件
        ApplicationContext applicationContext = 
            new ClassPathXmlApplicationContext("applicationContext.xml");
        //2.通过容器获取userDao实例
        UserDao userDao111 = (UserDao) applicationContext.getBean("userDao22");
    
        //3.调用实例中的say()方法
        userDao111.say();
    }
}

输出:userDao say hello World 222!

测试DI:

package com.itheima.ioc;
import org.springframework.context.ApplicationContext;
import 
    org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestDI {
    public static void main(String[] args) {
        //1.初始化spring容器,加载配置文件
        ApplicationContext applicationContext = 
             new ClassPathXmlApplicationContext("applicationContext.xml");
        //2.通过容器获取UserService实例
        UserService userService = 
            (UserService) applicationContext.getBean("userService");
        //3.调用实例中的say()方法
        userService.say();
    }
}

输出:

userDao say hello World 222!
userService say hello World !

猜你喜欢

转载自www.cnblogs.com/shoulinniao/p/10879029.html
今日推荐