SpringIOC注入三种方式灵活运用(第十四课)

简介: SpringIOC注入三种方式灵活运用(第十四课)

SpringIoc综合案例 这里采用方案一 配置文件的方式 方案二 注解的方式+配置文件的方式 方案三 不使用配置文件的方式

package com.spring.entity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
 * 一个标准类的封装
 */
@Component(value = "animal")
public class Animal {
    @Value("1003")
    private int  id;
    @Value("这里调用的是Car对象的内容小喵喵")
    private String name;
    @Value("20")
    private String age;
    @Value("白色")
    private String color;
    @Value("120")
    private int height;
    @Value("23")
    private  int weight;
    @Value("X的未知数")
    private  Object x;
    @Autowired
private Student student;

知识点一

@Autowired:该注解用于将引用数据类型的对象赋值给该类型的变量

   自动写入,前提条件是该变量名称一定要和对象名称一致

   当变量名和对象名不一致,那么需要使用@Qualifier(value = "对象名")和@Autowired注解一起使用

   @Resource(name = "对象名")的用法等价于@Qualifier(value = "对象名")和@Autowired注解一起使用

@Component(value = "car")
public class Car extends Animal {
    public Car() {
        System.out.println("这是Car的属性创建对象");
    }

知识点二

  • @Component:该注解用于创建普通类的对象
  • @Controller:该注解用于创建控制层类的对象
  • @Service:该注解用于创建业务逻辑层类的对象
  • @Repository:该注解用于创建数据访问层类的对象
package com.spring.entity;
/**
 * 顺便复习下继承
 */
public class Dog  extends  Animal{
    private int  id;            //狗编号
    private String name;        //狗姓名
    private String age;         //狗年龄
    private String color;       //狗皮肤的色彩
    private int height;         //狗的身高
    private  int weight;        //狗的重量
}

知识点三  重写 与 重载的区分

重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载.

重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private)。

重写的方法的返回值必须和被重写的方法的返回一致;

重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类;

被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写。

静态方法不能被重写为非静态的方法(会编译出错)

重载

overload是重载,一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同。

在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数类型可以是不同的参数类型,不同的参数个数,不同的参数顺序(参数类型必须不一样)

不能通过访问权限、返回类型、抛出的异常进行重载;

方法的异常类型和数目不会对重载造成影响;

/**
 * IOC注解的方式
 * @author MZFAITHDREAM
 * @Component:该注解用于创建普通类的对象
 * @Controller:该注解用于创建控制层类的对象
 * @Service:该注解用于创建业务逻辑层类的对象
 * @Repository:该注解用于创建数据访问层类的对象
 */
//value:该属性上定义的是对象名
//@Controller(value = "student")
//@Service(value = "student")
//@Repository(value = "student")
@Component(value = "student")
public class Student {
    //@Value:该注解用于给基本数据类型的全局变量进行赋值
    @Value("小明")
    private String name;
    @Value("20")
    private int age;
    @Value("18166666666")
    private String phone;
/**
 //@Autowired:该注解用于将引用数据类型的对象赋值给该类型的变量
 //自动写入,前提条件是该变量名称一定要和对象名称一致
 //当变量名和对象名不一致,那么需要使用@Qualifier(value = "对象名")和@Autowired注解一起使用
 //@Resource(name = "对象名")的用法等价于@Qualifier(value = "对象名")和@Autowired注解一起使用
 */
@Component(value = "tea")
public class Teacher {
    @Value("马云老师")
    private String name;
    @Value("60")
    private int age;
//    @Autowired:该注解用于将引用数据类型的对象赋值给该类型的变量
    @Autowired
    private Student student;
    public Teacher() {
        System.out.println("开始创建对象的信息内容");
    }
//    @PostConstruct是Java自带的注解,在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法。
    @PostConstruct
    public void init(){
        System.out.println("开始加载老师的数据信息");
    }
//@PreDestroy说明
//
//     被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,
//     类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。

@Autowired:该注解用于将引用数据类型的对象赋值给该类型的变量

自动写入,前提条件是该变量名称一定要和对象名称一致

当变量名和对象名不一致,那么需要使用@Qualifier(value = "对象名")和@Autowired注解一起使用


@Resource(name = "对象名")的用法等价于@Qualifier(value = "对象名")和@Autowired注解一起使用


@PostConstruct是Java自带的注解,在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法。

被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,

类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。

package com.spring.Utils;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
 * @author MZFAITHDREAM
 * @Configuration===>等价于文件的配置信息
 * @ComponentScan("com.spring.Entitys") 等价<context:component-scan base-package="com.spring.entity"></context:component-scan>
 */
@Configuration
//表示你要去扫描的包名的实体类 在哪里
@ComponentScan("com.spring.entity")
public class SpringUtil {
}v
<!--<bean id="填对象名" class="要创建对象的类的完整包名"></bean>-->
  <!--java注解的方式创建类的对象,该对象不写在这个主配置文件中
  写在了要创建对象的类的上面,需要在运行的时候,主配置文件要找到所有使用注解方式创建的对象
  然后动态的加载进主配置文件-->
<!--//狗编号//狗姓名//狗年龄//狗皮肤的色彩//狗的身高//狗的重量-->
  <bean id="dog" class="com.spring.entity.Dog">
    <property name="id" value="1002"></property>
    <property name="name" value="我是Spring框架的对象小狗"></property>
    <property name="age" value="9"></property>
    <property name="color" value="黑色"></property>
    <property name="height" value="120"></property>
    <property name="weight" value="11"></property>
    <property name="x" value="狗的run"></property>
  </bean>
<!--第三种方式Spring IOC框架注解的方式创建对象与赋值-->
  <!--用于加载所有的实体类中的文件名-->
  <!--指定所有Sping文件带有注解方式的对象所存在的包的完整路径-->
  <context:component-scan base-package="com.spring.entity"></context:component-scan>

测试 一 java的方式

 @Test
    public void java() {
        System.out.println("第一种方案java方式创建对象与赋值");
        Animal animal = new Animal();
        animal.setId(1001);
        animal.setAge("2");
        animal.setName("小鸟");
        animal.setColor("red");
        animal.setHeight(170);
        animal.setWeight(32);
        animal.setX("我是未知的属性");
        System.out.println(animal);
        System.out.print("动物编号" + animal.getId()
                + "动物姓名" + animal.getName()
                + "动物年龄" + animal.getAge()
                + "动物的身高" + animal.getHeight()
                + "动物的体重" + animal.getWeight()
                + "动物的色彩" + animal.getColor()
                + "动物的未知属性" + animal.getX());
    }

测试二  spring创建对象与赋值 Spring框架 利用Bean管理数据

 @Test
    public void SpringDog() {
        System.out.println("第二种方式Spring创建对象与赋值 Spring框架  利用Bean管理数据");
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        Dog dog = ac.getBean("dog", Dog.class);
        System.out.println("利用Spring文件赋值");
        System.out.println("狗的编号" + dog.getId()
                + "狗的姓名" + dog.getName()
                + "狗的年龄"
                + dog.getAge() + "狗的色彩"
                + dog.getColor() + "狗的身高"
                + dog.getHeight() + "狗的体重"
                + dog.getWeight() + "调用Animal的独有属性" +
                dog.getX());
    }

测试三   Spring IOC框架注解的方式创建对象与赋值

 @Test
    public  void SpringIocCar(){
//     运行时获得主配置文件
        ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
        Car car=ac.getBean("car",Car.class);
        System.out.println(car);
        System.out.println(car.getName());
    }

测试四   未知

  @Test
    public void SpringAnimalStudennt(){
        ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
        Animal animal=ac.getBean("animal",Animal.class);
        System.out.println(animal.getAge());
        System.out.println(animal.getId());
        System.out.println(animal.getName());
//调用
        System.out.println(animal.getStudent().getName());
        System.out.println(animal.getStudent().getAge());
    }

相关文章
|
6月前
|
缓存 算法 安全
Spring 为啥默认把bean设计成单例的?这篇讲的明明白白的
Spring 为啥默认把bean设计成单例的?这篇讲的明明白白的
89 0
|
6月前
|
Java Spring 容器
Spring框架讲解笔记:spring框架学习的要点总结
Spring框架讲解笔记:spring框架学习的要点总结
|
6月前
|
缓存 Java Spring
面试官猛的一问:Spring的Bean注入如何解决循环依赖的?
面试官猛的一问:Spring的Bean注入如何解决循环依赖的?
184 0
|
前端开发 Java 编译器
Java的第十六篇文章——枚举、反射和注解(后期再学一遍)
Java的第十六篇文章——枚举、反射和注解(后期再学一遍)
|
Java 数据库 Spring
Spring框架在Bean中的管理(第十一课)
Spring框架在Bean中的管理(第十一课)
203 0
|
设计模式 XML 开发框架
Spring框架中的SpringMvc三种方案实现的页面跳转(第十五课)
Spring框架中的SpringMvc三种方案实现的页面跳转(第十五课)
404 0
|
XML Java 数据格式
【Java框架型项目从入门到装逼】第一节 - Spring框架 IOC的丧心病狂解说,来一波神的视角
【Java框架型项目从入门到装逼】第一节 - Spring框架 IOC的丧心病狂解说,来一波神的视角
112 0
|
XML Java 数据库连接
Spring框架:第一章:介绍和准备工作
Spring框架:第一章:介绍和准备工作
100 0
Spring框架:第一章:介绍和准备工作
|
XML 缓存 Java
面试官:讲讲Spring框架Bean的加载过程
面试官:讲讲Spring框架Bean的加载过程
874 0
面试官:讲讲Spring框架Bean的加载过程