自动装配的注解
- @Component:组件
应用场景:这个类确实需要加入IOC容器,但是又不是下面典型的三种情况,其实就是
你在ApplicationContext.xml里面配置的bean
<bean id="happyFactoryBean" class="com.etu.spring.component.HappyFactoryBean">
<property name="factoryName" value="马保国说:年轻人好之为之"/>
</bean>
- @Controller:控制器
- @Service:对应业务逻辑层的Service类
- @Repository:对应持久化层的Dao或Mapper
从程序运行的角度来说,上面四个注解的作用是一样的,即使标记在了不对应的类上,Spring在运行过程中也不会报错。但是为了我们自己开发过程中不造成不必要的误解,我们还是要标记在正确的类上。
调用getBean()中对应的id
[1]使用上面注解将类加入IOC容器后,bean的id是类名首字母小写。例如:下面代码中,这个类在IOC容器中的bean的id是taskServiceSimpleImpl
@Service
public class TaskServiceSimpleImpl implements TaskService {
}
[2]指定bean的id
@Service(value = "taskImpl")
public class TaskServiceSimpleImpl implements TaskService {
}
调用getBean时可以
ApplicationContext iocContainer = new
ClassPathXmlApplicationContext("ApplicationContext.xml");
iocContainer.getBean("taskImpl");//这是指定bean的id
或者
iocContainer.getBean(TaskServiceSimpleImpl.class);
或者
iocContainer.getBean("taskServiceSimpleImp");//这是没指定bean的id
当自动装配时要使用可以
@Autowired
@Qualifier("taskImpl")
private TaskServiceSimpleImpl taskServiceSimpleImpl;
或者
@Autowired
private TaskServiceSimpleImpl taskServiceSimpleImpl;//不管指定或没指定bean的id都可以这样写
@Autowired注解查找目标bean的顺序
- 第一步:根据类型查找
- 第二步:根据变量名或方法名作为bean的id查找
这两种方式都找不到的话,会抛出异常
记录一个特殊的情况(已解决)
- 当一个类实现一个接口后,
- 这个类的有声明式事务的注解(@Transactional),当我们需要自动装配这个类时(@Autowired),必须装配这个类的接口。
- 如果这个类的没有声明式事务的注解,当我们需要自动装配这个类时(@Autowired),可以装配这个类或者这个类的接口。
Spring会为此类基于JDK动态代理技术创建代理对象,创建的代理对象完整类名为com.sun.proxy.$Proxy35 这个的35是随机的
在这里插入代码片
`解决方式操作步骤:
修改applicationContext-service.xml配置文件,开启事务控制注解支持时指定proxy-target-class属性,值为true。其作用是使用cglib代理方式为Service类创建代理对象,添加如下配置:
<!--开启事务控制的注解支持-->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>``
如果用到了dubbo的话,给service注解配置interfaceClass
@Service(interfaceClass = HelloService.class)
@Transactional
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String name) {
return "tom hello " + name;
}
}