java 装配_java之Spring装配Bean(手动装配、自动装配、注解装配)

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

1.手动装配

1

2

3

4

5

6

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

2.自动装配

1

2

3

看这个自动装配类型:

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

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

11

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

1 @Service2 public classUserservice {3 //定义接口的引用

4 privateUserDao userdao;5

6 //定义setter方法,设置接口的引用指向哪个实现类的对象

7 @Autowired8 public voidsetUserdao(UserDao userdao) {9 this.userdao =userdao;10 }11

12 public voiduseradd(User newuser) {13 //此时的userdao经过spring依赖注入之后已经实现指向特定的接口实现类对象14 //那么调用接口的方法,实际上是调用了特定实现类的方法的

15 userdao.adduser(newuser);16 }17 }

1 @Repository2 public class Usertodo1 implementsUserDao {3 //接口实现类为方法添加方法体

4 public voidadduser(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 classTest1 {2 @Test3 public voidadd() {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"),像这样在括号里就可以自定义名称了。

原文:http://www.cnblogs.com/eco-just/p/7847462.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值