zoukankan      html  css  js  c++  java
  • java之Spring(IOC)装配Bean(手动装配、自动装配、注解装配)

    在上一篇控制反转中我们看到了依靠一个Bean文件来实现对代码的控制,可谓十分便捷,再也不用去实例化对象了,2333~~~

    1.手动装配

    1 <bean id="todo" class="com.eco.daoimp.Usertodo1"></bean>
    2      
    3 <!--定义Userservice类内部接口的引用(userdao)指向具体的实现类对象(Usertodo1) -->
    4 <bean id="userservice" class="com.eco.service.Userservice">
    5      <property name="userdao" ref="todo"></property>     
    6 </bean>

    这里我们是手动装配Bean,指定Userservice类下的成员变量userdao是Usertodo1的实例化对象。

    2.自动装配

    1 <bean id="userdao2" class="com.eco.daoimp.Usertodo2" />

    2 <bean id="userdao" class="com.eco.daoimp.Usertodo1" />
    3 <bean id="userservice" class="com.eco.service.Userservice" auto-wire="byName" />

    看这个自动装配类型:

    byName:为Userservice类下的成员变量userdao自动装配id/name属性为userdao的bean,就是第二个bean,如果找不到名

                     为userdao的bean,就会报错!!!

    byType:为Userservice类下的成员变量userdao自动装配与之类型相同(UserDao)的bean,因为Usertodo1和Usertodo2

                   都是UserDao的实现了类,所以都会符合要求,那么程序就在纠结:到底装配id是userdao的bean还是装配id为

                   userdao2的bean呢,迟迟下不了决定,只好报错!!!所以慎用~~

    除此之外还有一个在beans标签定义的default-auto-wire="byName",相当于一个全局声明,告诉所有的bean标签采用我说

    的声明方式进行装配。

    3.注解装配

    annotation注解,注解就是采用一个@加上字段进行声明,就像我们常见的@Test、@Override等等

    采用注解进行装配之前,bean.xml文件要较之前有个改变:

     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" xmlns:p="http://www.springframework.org/schema/p"
     4     xmlns:context="http://www.springframework.org/schema/context"
     5     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     6     http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
     7     http://www.springframework.org/schema/context
     8     http://www.springframework.org/schema/context/spring-context-3.1.xsd">
     9     
    10     <context:component-scan base-package="com.eco"></context:component-scan>
    11 </beans>

    红字是较之前手动装配/自动装配新增的声明字段,然后内部只有一个标签,这个标签告诉容器要解析哪个包下的bean。

     1 @Service
     2 public class Userservice {
     3     // 定义接口的引用
     4     private UserDao userdao;
     5 
     6     // 定义setter方法,设置接口的引用指向哪个实现类的对象
     7     @Autowired
     8     public void setUserdao(UserDao userdao) {
     9         this.userdao = userdao;
    10     }
    11 
    12     public void useradd(User newuser) {
    13         // 此时的userdao经过spring依赖注入之后已经实现指向特定的接口实现类对象
    14         // 那么调用接口的方法,实际上是调用了特定实现类的方法的
    15         userdao.adduser(newuser);
    16     }
    17 }
     1 @Repository
     2 public class Usertodo1 implements UserDao {
     3     // 接口实现类为方法添加方法体
     4     public void adduser(User user) {
     5         // 利用Hibernate的工厂类获得Session对象和事务对象Transaction
     6         Session session = HibernateSessionFactory.getSession();
     7         Transaction transaction = session.beginTransaction();
     8         // 数据库添加用户操作
     9         session.save(user);
    10         // 提交事务
    11         transaction.commit();
    12         // 关闭session对象
    13         session.close();
    14         System.out.println("todo1 create the user");
    15     }
    16 }

    红字标注的三个注解意思就是:为@Service声明的Userservice类,内部的@Autowired声明的userdao变量,注入了

    @Repository声明的Usertodo1实现类。

    依赖注入有①接口注入②setter注入③构造方法注入,很明显上面的例子是setter注入,

    接口注入就将注解写在定义的成员变量上;

    setter注入就将注解写在setter方法上;

    构造方法注入就将注解写在构造方法上(很明显上面没有定义构造方法)。

    调用的时候方法还是和之前一样:

     1 public class Test1 {
     2     @Test
     3     public void add() {
     4         // Spring读取beans。xml文件
     5         ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
     6         // 解析id为userservice的bean标签,内部实现UserDao userdao = new Usertodo1()
     7         Userservice service = (Userservice) ctx.getBean("userservice");
     8         User newuser = new User("桔子桑", 31);
     9         // 此时调用的useradd()方法,就是接口实现类Usertodo1的useradd()方法
    10         service.useradd(newuser);
    11     }
    12 }

    只是这个bean的名称,默认是采用@Service声明的类的名称首字母小写,其余不变作为bean的id/name;

    我们也是可以自定义这个bean名称的,@Service("eco"),像这样在括号里就可以自定义名称了。

  • 相关阅读:
    「JOISC 2020 Day3」收获
    $ ext{Min25}$筛
    [做题记录-图论] [NEERC2017]Journey from Petersburg to Moscow [关于处理路径前$k$大的一种方法]
    [复习笔记]一些有意思的解法技巧 (转 Dpair
    [比赛记录] CSP2021-S 题解
    [转]C++学习心得
    Sigmoid function in NN
    Kernel Regression from Nando's Deep Learning lecture 5
    Python codes
    php中mail()改用msmtp发送邮件
  • 原文地址:https://www.cnblogs.com/eco-just/p/7847462.html
Copyright © 2011-2022 走看看