IOC个人总结
Spring Ioc 个人总结
IOC思想 inversion of control 控制反转:
大部分的定义就是:构造对象的权利被反转,原先我们自己主动创建对象调用构造方法传参,现在我们依赖于工厂或者说依赖于某一个容器,将对象构造的权利交给其他对象,构造对象的权利被反转了。说白了也就一句话:将创建对象的权力交由Ioc容器来完成。
在springioc中最常见的问题是对注解的不了解,也就导致了对bean认知不够到位,当热我也是菜鸡,这里也只是分享了自己的想法。
谈ioc之前,先说说mybatis的一些问题。先上代码(configuration.xml文件):
1 | <?xml version="1.0" encoding="UTF-8"?> |
代码中我们这里虽然简化了sql语句的书写,但是对于dao的方法却还没有进一步简化,这也就是现在经常和spring一起使用的原因了。在spring中我们将本应写在dao的实现方法给直接实现了。代码:`public abstract class BaseDao
private String namespace;
//private SqlSession session = SqlSessionUtil.getSqlSession();
public BaseDao(Class<T> clazz) {
namespace = clazz.getName();//这里是通过反射获取到类
}
public void insertEntity(T t) {
SqlSession session = SqlSessionUtil.getSqlSession();
session.insert(namespace + ".insert", t);
SqlSessionUtil.closeResources(session);
}
public void deleteEntity(String id) {
SqlSession session = SqlSessionUtil.getSqlSession();
session.delete(namespace + ".delete", id);
SqlSessionUtil.closeResources(session);
}`
1 | 就不完全展示了,大概知道意思就行了。然而,我们在Spring与Mybatis就可以直接将dao层写成接口,因为具体方法已经在配置文件中实现了。 |
` <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<property name="basePackage" value="com.wzl.dao"></property>
<!-- 注意这里的是value 不是ref -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
其中:org.mybatis.spring.mapper.MapperScannerConfigurer 这个类是spring对mybatis的一个支持类,他将dao层的所有接口自动找到,并自动实现其中的所有方法,省去了大量代码。接下来就是service的代码书写:
通常我们会在类上看到@Service这个注解,在方法上我们会看到@Autowired或者是@Resource这样的注解 ,第一个是Spring框架提供的,第二个是JDK自带的注解。我们逐渐解决:
1.@Service 这个的意思是将这个类注册进容器中。如何实现的呢?<context:component-scan base-package="com.wzl"> <!-- 表示不扫描控制层 --> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan>
所示,在配置文件中,扫描了com.wzl的整个目录,spring会将扫描下面的@Service注解的配置类,这就相当于一个bean注册进了ioc容器。思想也变在这里体现出来了:将创建对象的权力交给了容器。
2.@Autowired这个注解 :它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。通过 @Autowired的使用来消除 set ,get方法。通过@Autowired自动装配方式,从IoC容器中去查找到,并返回给该属性。简单来说就是将ioc中对象取出来。例如:在impl层中,@Service public class CartServiceImpl implements ICartService { @Autowired CartDao cartDao; @Override public void add(Cart cart) { cartDao.add(cart); }
我们通过@Autowired注解创建出了cartDao对象,其实这也是一个bean,在@Autowired之前我们要获取到这样的一个bean对象:
1 | <bean id="cartDao" class="..."/> |
在配置文件中是这样的,但是我们通过注解就简化了操作。可以直接拿到bean对象(cartDao)进行调用dao层的方法。
从上就可以得知:@Service是将ipml层下的业务逻辑类创建对象的权力就给了ioc容器,@Autowired是将ioc容器中的对象,取出。
其他常见的注解(注解会逐步替代配置文件)
@ComponentScan 这个注解相当于:<context:component-scan base-package="">
起到自动扫描的作用。
@Controller 这个不用说。
@Repository 这个用于持久层的,但是我目前没有用过。
更多详细:关于@CompontScan注解详情
各个注解的区别