Spring——使用IoC和DI模拟注册案例、注解配置IoC和DI

目录

  • 一、使用IoC和DI模拟注册案例(XML配置)
  • 二、注解配置IoC和DI
    • 1、DI注解
      • 1.1、Autowired注解和Qualifier注解
      • 1.2、Resource注解
      • 1.3、Value注解
    • 2、IoC注解_bean组件版型注解
    • 3、作用域注解和初始化、销毁注解
    • 4、IoC和DI其实是同一个东西
  • 三、 使用IoC和DI模拟注册案例(注解配置)

在这里插入图片描述

Spring系列

  1. Spring — Spring简介、入门、配置 , IoC和DI思想
  2. Spring — IoC核心(基于XML)、DI核心(基于XML)
  3. Spring — 使用IoC和DI模拟注册案例、注解配置IoC和DI
  4. Spring — 静态代理、动态代理、拦截器思想
  5. Spring — AOP思想、AOP开发、Pointcut语法、注解配置AOP
  6. Spring — DAO层、Spring JDBC、Spring事务控制
  7. Spring — XML配置事务、注解+XML、纯注解的配置方式
  8. Spring整合MyBatis
  9. Spring Java Config — 组件注册相关注解
  10. Spring Java Config — 常用注解

一、 使用IoC和DI模拟注册案例(XML配置)

跳转到目录

  • 数据库
CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(40) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

使用的一些类和接口
Spring——使用IoC和DI模拟注册案例、注解配置IoC和DI_第1张图片

  • 类和接口
// domain包下的User类
@Getter
@Setter
@ToString
public class User {
    private Long id;
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

//--------------------------------------------

// controller包下的UserController类
// 模拟Struct2的Action / SpringMVC的Controller
public class UserController {

    @Setter
    private UserService service;

    public String register(){
        System.out.println("注册请求");
        service.register(new User("朝阳", 100));
        return "success";
    }
}

//--------------------------------------------

// service包下的UserService接口和实现类
public interface UserService {
    // 注册
    void register(User u);
}
public class UserServiceImpl implements UserService {

    @Setter
    private UserDao dao;

    public void register(User u) {
        System.out.println("注册方法");
        dao.save(u);
    }
}

//--------------------------------------------

// dao包下的UserDao接口和实现类
public interface UserDao {
    // 保存用户信息
    void save(User u);
}
public class UserDaoImpl implements UserDao {

    @Setter
    private DataSource dataSource;

    @SneakyThrows // 偷偷抛出已检查的异常
    public void save(User u) {
        System.out.println("保存操作");
        @Cleanup // 处理资源关闭
        Connection conn = dataSource.getConnection();
        String sql = "INSERT INTO user(name ,age) VALUES(?,?)";
        @Cleanup
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setString(1, u.getName());
        ps.setInt(2, u.getAge());
        ps.executeUpdate();
    }
}
  • db.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring
jdbc.username=root
jdbc.password=1111
jdbc.initialSize=2
  • xml文件(重点操作)

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    
    
    <context:property-placeholder location="classpath:db.properties"/>

    
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
          init-method="init" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="initialSize" value="${jdbc.initialSize}"/>
    bean>

    
    <bean id="userDao" class="com.sunny._06_register.dao.impl.UserDaoImpl">
        <property name="dataSource" ref="dataSource"/>
    bean>

    
    <bean id="userService" class="com.sunny._06_register.service.impl.UserServiceImpl">
        <property name="dao" ref="userDao"/>
    bean>

    
    <bean id="userController" class="com.sunny._06_register.controller.UserController">
        <property name="service" ref="userService"/>
    bean>
beans>

Spring——使用IoC和DI模拟注册案例、注解配置IoC和DI_第2张图片

  • 测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class RegisterTest {

    // @Autowired:表示从Spring IoC容器中根据类型找到对应的bean,并自动注入到某个字段上
    @Autowired
    private UserController uc;

    @Test
    public void test(){
        uc.register();
    }
}
  • 输出
    Spring——使用IoC和DI模拟注册案例、注解配置IoC和DI_第3张图片

二、注解配置IoC和DI

 * 曾经XML的配置:
 *  
 *      
 *  
 *
 * 用于创建对象的
 *      他们的作用就和在XML配置文件中编写一个标签实现的功能是一样的
 *      Component:
 *          作用:用于把当前类对象存入spring容器中
 *          属性:
 *              value:用于指定bean的id。当我们不写时,它的默认值是当前类名,且首字母改小写。
 *      Controller:一般用在表现层
 *      Service:一般用在业务层
 *      Repository:一般用在持久层
 *      以上三个注解他们的作用和属性与Component是一模一样。
 *      他们三个是spring框架为我们提供明确的三层使用的注解,使我们的三层对象更加清晰
 *
 *
 * 用于注入数据的
 *      他们的作用就和在xml配置文件中的bean标签中写一个标签的作用是一样的
 *      Autowired:
 *          作用:自动按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功
 *                如果ioc容器中没有任何bean的类型和要注入的变量类型匹配,则报错。
 *                如果Ioc容器中有多个类型匹配时:
 *          出现位置:
 *              可以是变量上,也可以是方法上
 *          细节:
 *              在使用注解注入时,set方法就不是必须的了。
 *      Qualifier:
 *          作用:在按照类中注入的基础之上再按照名称注入。它在给类成员注入时不能单独使用。但是在给方法参数注入时可以(稍后我们讲)
 *          属性:
 *              value:用于指定注入bean的id。
 *      Resource
 *          作用:直接按照bean的id注入。它可以独立使用
 *          属性:
 *              name:用于指定bean的id。
 *      以上三个注入都只能注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实现。
 *      另外,集合类型的注入只能通过XML来实现。
 *
 *      Value
 *          作用:用于注入基本类型和String类型的数据
 *          属性:
 *              value:用于指定数据的值。它可以使用spring中SpEL(也就是spring的el表达式)
 *                      SpEL的写法:${表达式}
 *
 * 用于改变作用范围的
 *      他们的作用就和在bean标签中使用scope属性实现的功能是一样的
 *      Scope
 *          作用:用于指定bean的作用范围
 *          属性:
 *              value:指定范围的取值。常用取值:singleton prototype
 *
 * 和生命周期相关 了解
 *      他们的作用就和在bean标签中使用init-method和destroy-methode的作用是一样的
 *      PreDestroy
 *          作用:用于指定销毁方法
 *      PostConstruct
 *          作用:用于指定初始化方法

跳转到目录

1、DI注解

跳转到目录

1.1、Autowired注解和Qualifier注解

跳转到目录
Spring——使用IoC和DI模拟注册案例、注解配置IoC和DI_第4张图片
Java类

public class Cat {
}
public class Person {
    //@Autowired
    private Cat c1;

/*  @Autowired
    public void setC1(Cat c1) {
        this.c1 = c1;
    }*/
    @Override
    public String toString() {
        return "Person{" +
                "c1=" + c1 +
                '}';
    }
}

将@Autowired贴在字段或者setter方法上,Spring会自动将该字段所需要的对象(cat对象)找出来并注入到该对象(person)中, 以前还需要在XML中手动将Cat用ref注入到Person对象中;

  • xml配置
    一定要配置DI注解解析器(对DI注解作解释)
    <context:annotation-config/>
    

<context:annotation-config/>

<bean id="cat1" class="com.sunny.di.Cat"/>
<bean id="cat2" class="com.sunny.di.Cat"/>
<bean id="person" class="com.sunny.di.Person"/>
1.2、Resource注解

跳转到目录
Spring——使用IoC和DI模拟注册案例、注解配置IoC和DI_第5张图片

// 只会去找id为cat1的Cat对象,如果找不到就直接报错!
@Resource(name = "cat1")
private Cat c1;

注意: @Autowired@Resource基本上功能一模一样,开发中两者选其一即可!
在这里插入图片描述

1.3、Value注解

跳转到目录
Autowired和Resource注解用于注入对象, Value注解用于注入常量数据(简单类型数据);

server.properties

server.port=781

Java类

public class ValueBean {
    //@Value("9999")
    @Value("${server.port}")
    private int port;

    @Override
    public String toString() {
        return "ValueBean{" +
                "port=" + port +
                '}';
    }
}

xml文件

    
    <context:annotation-config/>

    
    <context:property-placeholder location="classpath:db.properties, classpath:server.properties "/>
    
    <bean id="valueBean" class="com.sunny.di.ValueBean"/>

Spring——使用IoC和DI模拟注册案例、注解配置IoC和DI_第6张图片
测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class DiTest {

    //@Autowired
    @Resource
    private Person person;

    @Autowired
    private ValueBean valueBean;

    @Test
    public void test(){
        System.out.println(person);
        System.out.println(valueBean);
    }
}

在这里插入图片描述

2、IoC注解

跳转到目录
bean组件版型:四个组件的功能是相同的,只是用于标注不同类型的组件。

  • @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
  • @Repository用于标注数据访问组件, 即DAO组件
  • @Service用于标注业务层组件
  • @Controller用于标注控制层组件(如struts中的Action , SpringMVC的Controller) .

配置IoC注解解析器

 
 <context:component-scan base-package="com.sunny.ioc"/>

表示去哪些包中及其子包中扫描组件注解

Java类

// XML配置方式: 
// 注解配置: @Component
@Component("myDataSource") //组件如果不写value属性值,此时bean的id默认是类型首字母小写:myDataSource
public class MyDataSource {
}

xml文件


<context:annotation-config/>


<context:component-scan base-package="com.sunny.ioc"/>



测试类

    @Autowired
    private MyDataSource mds;

    @Test
    public void test(){
        System.out.println(mds);
    }

两种方式都可以成功创建MyDataSource对象!

3、作用域注解和初始化、销毁注解

跳转到目录

  • 作用域注解使用@Scope注解
  • 初始化注解使用@PostConstruct 用于贴在初始化方法上
  • 销毁注解使用@PreDestroy 用于贴在销毁方法上

java类

@Component
//@Scope("prototype") // 默认不写就是单例的
//@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class SomeBean {
    public SomeBean() {
        System.out.println("构造SomeBean对象");
    }

    @PreDestroy // 销毁对象之前执行
    public void close() {
        System.out.println("销毁方法");
    }

    @PostConstruct // 构建对象之后执行
    public void open() {
        System.out.println("初始化方法");
    }
    public void doWork() {
        System.out.println("工作");
    }
}
    
    

    
    <context:component-scan base-package="com.sunny.lifecycle"/>

测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class LifeCycleTest {

    @Autowired
    private SomeBean sb1;
    @Autowired
    private SomeBean sb2;

    @Test
    public void test(){
        System.out.println(sb1);
        System.out.println(sb2);
        sb1.doWork();
    }
}

Spring——使用IoC和DI模拟注册案例、注解配置IoC和DI_第7张图片

4、 IoC和DI其实是同一个东西

跳转到目录

  • IoC: 字面上,更多强调的是Spring容器帮我们创建对象
  • DI: 字面上,Spring不仅帮我们创建对象,还要为该对象设置依赖的数据

三、 使用IoC和DI模拟注册案例(注解配置)

跳转到目录

  • 数据库
CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(40) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

使用的一些类和接口
Spring——使用IoC和DI模拟注册案例、注解配置IoC和DI_第8张图片

  • 类和接口
// domain包下的User类
@Getter
@Setter
@ToString
public class User {
    private Long id;
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

//--------------------------------------------

// controller包下的UserController类
// 模拟Struct2的Action / SpringMVC的Controller
@Controller
public class UserController {
	//@Setter
	@Autowired
    private UserService service;

    public String register(){
        System.out.println("注册请求");
        service.register(new User("阳仔", 99));
        return "success";
    }
}

//--------------------------------------------

// service包下的UserService接口和实现类
public interface UserService {
    // 注册
    void register(User u);
}
@Repository
public class UserServiceImpl implements UserService {
	
	//@Setter
    @Autowired // 是按类型去找
    private UserDao dao;

    public void register(User u) {
        System.out.println("注册方法");
        dao.save(u);
    }
}

//--------------------------------------------

// dao包下的UserDao接口和实现类
public interface UserDao {
    // 保存用户信息
    void save(User u);
}
@Repository
public class UserDaoImpl implements UserDao {
	//@Setter
    @Autowired
    private DataSource dataSource;

    @SneakyThrows // 偷偷抛出已检查的异常
    public void save(User u) {
        System.out.println("保存操作");
        @Cleanup // 处理资源关闭
        Connection conn = dataSource.getConnection();
        String sql = "INSERT INTO user(name ,age) VALUES(?,?)";
        @Cleanup
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setString(1, u.getName());
        ps.setInt(2, u.getAge());
        ps.executeUpdate();
    }
}

Spring——使用IoC和DI模拟注册案例、注解配置IoC和DI_第9张图片

  • db.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring
jdbc.username=root
jdbc.password=1111
jdbc.initialSize=2
  • xml文件(重点操作)

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    
    <context:annotation-config/>
    
    <context:component-scan base-package="com.sunny._01_register"/>

    

    <context:property-placeholder location="classpath:db.properties, classpath:server.properties "/>
    

    
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
          init-method="init" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="initialSize" value="${jdbc.initialSize}"/>
    bean>
    
beans>
  • 测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class RegisterTest {

    // @Autowired:表示从Spring IoC容器中根据类型找到对应的bean,并自动注入到某个字段上
    @Autowired
    private UserController uc;

    @Test
    public void test(){
        uc.register();
    }
}
  • 输出
    Spring——使用IoC和DI模拟注册案例、注解配置IoC和DI_第10张图片

你可能感兴趣的:(Spring)