Spring Ioc 个人总结

Spring Ioc 个人总结

IOC思想 inversion of control 控制反转:

大部分的定义就是:构造对象的权利被反转,原先我们自己主动创建对象调用构造方法传参,现在我们依赖于工厂或者说依赖于某一个容器,将对象构造的权利交给其他对象,构造对象的权利被反转了。说白了也就一句话:将创建对象的权力交由Ioc容器来完成
在springioc中最常见的问题是对注解的不了解,也就导致了对bean认知不够到位,当热我也是菜鸡,这里也只是分享了自己的想法。
谈ioc之前,先说说mybatis的一些问题。先上代码(configuration.xml文件):

  <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
  <configuration>
  <environments default="develop">
  <environment id="develop">
  <transactionManager type="JDBC"/>
  <dataSource type="POOLED">
  <property name="driver" value="com.mysql.jdbc.Driver"/>
  <property name="url" value="jdbc:mysql://localhost:3306/week1?useSSL=false"/>
  <property name="username" value="root"/>
  <property name="password" value="123456"/>
  </dataSource>
  </environment>
  
  </environments>
  <mappers>
  <mapper resource="cn/gnnu/entity/StudentMapper.xml"/>
  <mapper resource="cn/gnnu/entity/ClaMapper.xml"/>
  <mapper resource="cn/gnnu/entity/UserInfoMapper.xml"/>
  </mappers>
  </configuration>

代码中我们这里虽然简化了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);
}`
   就不完全展示了,大概知道意思就行了。然而,我们在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对象:

<bean id="cartDao" class="..."/>

<bean id="icartService" class="...">

    <property name="cartDao">

      <ref bean="cartDao"/>

    </property>

</bean>

在配置文件中是这样的,但是我们通过注解就简化了操作。可以直接拿到bean对象(cartDao)进行调用dao层的方法。
从上就可以得知:@Service是将ipml层下的业务逻辑类创建对象的权力就给了ioc容器,@Autowired是将ioc容器中的对象,取出。
其他常见的注解(注解会逐步替代配置文件)
@ComponentScan 这个注解相当于:<context:component-scan base-package="">起到自动扫描的作用。
@Controller 这个不用说。
@Repository 这个用于持久层的,但是我目前没有用过。
更多详细:关于@CompontScan注解详情
各个注解的区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值