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