• 基于注解的DI


    基于注解的DI:使用spring提供的注解,完成java对象的创建,属性赋值。

    核心步骤:

    (1)在源代码加入注解,例如@Component

    (2)在spring的配置文件中,加入组建扫描器标签

    和Component功能相同的创建对象的注解:

    @Repository:放在dao接口实现类上面,表示创建dao对象,持久层对象,能访问数据库。

     @Service:放在业务层接口实现类上面,表示创建业务层对象,业务层对象有事务的功能。

    @Controller:放在控制器类的上面,表示创建控制器对象,属于表示层对象。

                            控制器对象能接受请求,把请求的处理结果显示给用户。

    以上四个注解都能创建对象,但是@Reposity @Service @Controller 有角色说明,表示对象是分层的。

    1.@Conmonent

    用来创建java对象,相当于bean标签的作用。

    默认的对象名称:类名称首字母小写

    1. /**
    2. * @author wangqi
    3. * @data 2022/8/311748
    4. *@Component,表示创建对象,对象放到容器中,作用是
    5. * 属性:value,表示对象名称,也就是bean的id属性值
    6. * 位置:在类的上面,表示创建此类的对象。
    7. */
    8. //使用value指定对象的名称
    9. @Component(value="mystudent")
    10. public class Student {
    11. private String name;
    12. private int age;
    13. public Student(){
    14. System.out.println("Student无参构造方法");
    15. }
    16. @Override
    17. public String toString() {
    18. return "Student{" +
    19. "name='" + name + '\'' +
    20. ", age=" + age +
    21. '}';
    22. }
    23. }
    1. package="com.wangqi.ioc2.项目.ba08"/>

    2.扫描多个包的三种方式

    2.1使用多次组件扫描器

     

     

    2.2使用分隔符(;或者,或者 空格),指定多个包

    2.3:指定父包

    3.属性赋值

    3.1简单属性赋值:@Value

    属性:value简单类型属性值

    位置:(1)在属性定义上面,无需set方法,推荐使用

               (2)在set方法上面

    1. @Component("myStudent")
    2. public class Student {
    3. //进行简单类型的属性赋值:@value
    4. //使用外部属性文件中的数据,语法@Value(${"key})
    5. //@Value(value="李四")
    6. @Value("${myname}")
    7. private String name;
    8. //@Value(value="20")
    9. @Value("${myage}")
    10. private int age;
    11. public Student(){
    12. System.out.println("Student无参构造方法");
    13. }
    14. @Override
    15. public String toString() {
    16. return "Student{" +
    17. "name='" + name + '\'' +
    18. ", age=" + age +
    19. '}';
    20. }
    21. public void setName(String name) {
    22. this.name = name;
    23. }
    24. public void setAge(int age) {
    25. this.age = age;
    26. }
    27. }
    1. package="com.wangqi.ioc2.项目.ba09"/>
    2. "classpath:/ba09/myconf.properties"/>
    3. "mySchool" class="com.wangqi.ioc2.项目.ba10.School">
    4. "name" value="航空大学"/>
    5. "address" value="北京的海淀"/>
    1. myname=agla
    2. myage=28

    3.2引用类型属性赋值

    @Autowired:

    spring框架提供的,给引用类型赋值的,使用自动注入原理 ,支持

    byName,byType,默认是byType

    位置:

    (1)在属性定义上面,无需set方法,推荐使用

    (2)在set方法上面

    1. @Component("myStudent")
    2. public class Student {
    3. //进行简单类型的属性赋值:@value
    4. //使用外部属性文件中的数据,语法@Value(${"key})
    5. @Value("${myname}")
    6. private String name;
    7. @Value("${myage}")
    8. private int age;
    9. //引用类型
    10. //@Autowired:spring框架提供的,给引用类型赋值的,使用自动注入原理
    11. //支持byName,byType,默认是byType
    12. //byName自动注入
    13. //1.@Autowired:给引用类型赋值
    14. //2.@Qualifer(value="bean的id"):从容器中找到指定名称的对象,把这个对象赋值给引用类型。
    15. @Autowired
    16. @Qualifier(value = "mySchool")
    17. private School school;
    18. public Student(){
    19. System.out.println("Student无参构造方法");
    20. }
    21. @Override
    22. public String toString() {
    23. return "Student{" +
    24. "name='" + name + '\'' +
    25. ", age=" + age +
    26. ", school=" + school +
    27. '}';
    28. }
    29. }
    1. package="com.wangqi.ioc2.项目.ba10"/>
    2. "classpath:/ba09/myconf.properties"/>
    3. "mySchool" class="com.wangqi.ioc2.项目.ba10.School">
    4. "name" value="航空大学"/>
    5. "address" value="北京的海淀"/>
    1. public class MyTest11 {
    2. @Test
    3. public void test01(){
    4. String config= "ba11/applicationContext.xml";
    5. ApplicationContext ctx =new ClassPathXmlApplicationContext(config);
    6. //myStudent区分大小写
    7. Student student =(Student)ctx.getBean("myStudent");
    8. System.out.println("student=="+student);
    9. }
    10. }

    @Autowired注解的required属性

    属性:required:boolean类型的属性,默认true

    true:spring在启动的时候,创建容器对象的时候,会检查引用类型是否赋值成功。如果复制失败,终止程序执行,并报错。

    false:引用类型赋值失败,程序正常执行,不报错。引用类型的值是null。

    1. @Autowired(required = false)
    2. @Qualifier(value = "mySchoolaaaaaaa")
    3. private School school;
    4. public Student(){
    5. System.out.println("Student无参构造方法");
    6. }

    JDK提供的@Resourse自动注入

    支持byName,byType,默认是byName

    并不是spring提供的,spring只是支持这个注解的使用

    (1)在属性定义的上面,无需set方法,推荐使用

    (2)在set方法的上面

    先使用byName赋值,如果赋值失败再使用byType

    说明,使用jdk1.8带有@Resource注解,高于jdk1.8没有这个@Resourse,需要加入一个依赖。

    @Resource只使用byName的方式,使用注解属性name="bean的id"

    总结:

     

     IoC:管理对象的,把对象放在容器中,创建、赋值,管理依赖关系。

    IoC:通过管理对象,实现解耦合。IoC解决处理业务逻辑对象之间的耦合关系,也就是service和dao之间的解耦合。

    spring作为容器适合管理什么对象:

    (1)service对象,dao对象

    (2)工具类对象

    不适合交给spring的对象?

    (1)实体类

    (2)servlet,listener,filter等web中的对象,他们是tomcat创建管理的

  • 相关阅读:
    Java高级——Class文件及解析
    [ CTF ]【天格】战队WriteUp-第六届”蓝帽杯“全国大学生网络安全技能大赛(半决赛)
    【人工智能 & 机器学习 & 深度学习】基础选择题 31~60题 练习(题目+答案),亦含 判断题
    王杰qtday4
    java-jni 十进制转十六进制应用,根据基址获取包裹首地址
    (附源码)计算机毕业设计SSM基于的社区疫情管理系统
    JS(二)
    【UniApp】-uni-app-pinia存储数据
    【教学类-40-02】A4骰子纸模制作2.0(统计表、棋盘)
    常用模型结构(FNN、CNN、RNN、TDNN、FSMN、Attention)
  • 原文地址:https://blog.csdn.net/wxx200008/article/details/126628831