zoukankan      html  css  js  c++  java
  • spring之 注解ioc&依赖注入 & spring整合mybatis

    0x01、IOC注解开发

    两个步骤:

    ​ 1、使用注解

    ​ 2、配置包扫描

    • 1、添加依赖
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>
    
    • 2、使用@Component注解
    import com.idea.service.UserService;
    import org.springframework.stereotype.Component;
    
    /*
    	value属性就是id
    	@Component(value = "userService") 可以去掉value
    	@Component("userService")
    */
    @Component(value = "userService")
    
    // 等同于 在xml里面,<bean id="userService" class="具体的类">
    public class UserServiceImpl implements UserService {
        @Override
        public String getName() {
            return "王五";
        }
    }
    
    • 3、配置包扫描

    在beans标签内部,使用context:component-scan ,让spring扫描该基础包下的所有子包注解

    <context:component-scan base-package="com.idea"></context:component-scan>
    

    用于改变作用范围的@scope

    @scope

    ​ singleton: 单例(默认)

    ​ prototype:多例

    ​ @Scope注解用来描述类的作用范围的,默认值singleton。如同xml中bean标签的属性scope <bean scope=""/>.如果配置成多例的使用prototype。

    @Scope("prototype")
    @Component("accountService")
    public class AccountServiceImpl implements AccountService {}
    

    3.3和生命周期相关的【了解】

    其他:

    <!---
    	1.在要进行IOC的类上添加注解:以下四个注解的作用是一样的,都可以给对象IOC
           不同的注解
            1、Component("id") 	 使用在除了三层结构的其他类上
      		2、Controller("id")   配置在表现出的各种Controller类上
    		3、Service("id")      配置在业务层的各种Service类上
    		4、Repository("id")   在持久层的各种Dao的实现类上(但Mybatis没有dao的实现类,所以基本用不上)
        
    ->
    
    1. 配置bean的作用范围 <bean scope=""></bean>

      • @Scope("类型")
        • singleton 单例【默认】
        • prototype 多例

      配置和生命周期相关的 <bean init-method="" destroy-method=""></bean>

      • @PostConstruct init-method="" 执行方法前
      • @PreDestroy destroy-method="" 方法执行结束后

    0x02、注解进行依赖注入

    1、环境

    dao层暂且不写

    首先我们需要进行IOC,来进行实例化对象,所以使用@Controller@Service注解

    如果没有配置id的话,对象名获取的是当前类的首字母小写

    • UserController
    import com.idea.service.UserService;
    import org.springframework.stereotype.Controller;
    
    @Controller
    public class UserController {
        private UserService userService;
        public String getName(){
            //调用业务层的getName()方法
            return userService.getName();
        }
    }
    
    • UserService
    import com.idea.service.UserService;
    import org.springframework.stereotype.Service;
    
    
    @Service
    public class UserServiceImpl implements UserService {
        @Override
        public String getName() {
            return "王五";
        }
    }
    
    • springConfig.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
        <!--1. 配置包扫描-->
        <context:component-scan base-package="com.idea"></context:component-scan>
    </beans>
    

    2、使用注解注入属性

    (一)、@Autowired注解进行属性注入

    @Autowired :自动装配(如果spring的核心容器中,只有一个该类型的对象,则自动把那个对象注入)
    

    如果此时多了一个service接口的实现类

    • UserServiceImplAuto
    import com.idea.service.UserService;
    import org.springframework.stereotype.Service;
    
    
    @Service
    public class UserServiceImpl implements UserService {
        @Override
        public String getName() {
            return "赵六";
        }
    }
    

    此时就会跟 UserServiceImpl产生冲突,进行报错

    (二)、@Qualifier注解注入

    这时候我们可以使用@Qualifier注解进行手动注入

    • UserController
    import com.idea.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    
    @Controller
    public class UserController {
        @Qualifier("UserServiceImplAuto")
        private UserService userService;
        public String getName(){
            //调用业务层的getName()方法
            return userService.getName();
        }
    }
    
    

    (三)、@Resource注解注入

    @Resource注解:可以手动,也可以自动
    				当实现类为一个的时候,可以自动
    				当多个实现类的时候,可以像Qualifier手动属性赋值
    
    1. @Autowired
    2. @Qualifier

    这两个注解是spring里面的

    @Resource 是jdk里面的

    0x03、spring整合Mybatis

    • 1、引入依赖
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <!--spring-->
        <spring.version>5.0.2.RELEASE</spring.version>
        <!--日志打印框架-->
        <slf4j.version>1.6.6</slf4j.version>
        <log4j.version>1.2.12</log4j.version>
        <!--mysql-->
        <mysql.version>5.1.6</mysql.version>
        <!--mybatis-->
        <mybatis.version>3.5.3</mybatis.version>
    </properties>
    
    <dependencies>
        <!--引入依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--mysql依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <!-- log start -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
    
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
    
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <!-- log end -->
    
        <!--mybatis的依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
    
        <!--
              mybatis整合spring的依赖
            -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.0</version>
        </dependency>
    
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
        </dependency>
    
        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    

    我们的重点是将创建的代理对象放到spring的核心容器中

    • springConfig.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
        <!-- 1. 包扫描 -->
        <context:component-scan base-package="com.idea"></context:component-scan>
    
        <!--
            2. spring整合mybatis
               配置jdbc的环境
                由spring配置dataSource(既可以使用spring内置的dataSource,又可以使用第三方的DataSource)
        -->
        <!-- 1、spring内置的DataSource -->
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="username" value="root"></property>
            <property name="password" value="root"></property>
            <property name="url" value="jdbc:mysql:///mybatis?characterEncoding=utf8"></property>
            <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        </bean>
        <!-- 2、将SqlSessionFactoryBean 对象进行IOC配置到spring的核心容器中,并且将dataSource注入进去 -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource"></property>
            <!--别名配置的包扫描-->
            <property name="typeAliasesPackage" value="com.idea.pojo"></property>
        </bean>
        <!--
            3、扫描dao包,创建出dao的代理对象,交给spring的核心容器管理
                扫描完包,完成了实例化,那对象id是什么?
                    就是接口名首字母改小写
        -->
        <bean id="scannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="com.idea.dao"></property>
        </bean>
    </beans>
    

    这时候mybatis的主配置文件直接不要了,已经整合到了spring

    也不用执行原本这么复杂的代码了,直接缩短到短短的三行

    @Test
        public void test01() throws IOException {
            //1. 加载主配置文件
            InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
            //2. 创建SqlSessionFacyoryBuilder对象
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            //3. 构建出SqlSessionFactory对象
            SqlSessionFactory sessionFactory = builder.build(is);
            //4. 创建出Sqlsession对象
            SqlSession sqlSession = sessionFactory.openSession();
            //5. 创建UserDao接口的代理对象
            UserDao userDao = sqlSession.getMapper(UserDao.class);
            //6. 调用代理对象的方法
            List<User> userList = userDao.findAll();
    
            System.out.println(userList);
    
            //7. 关闭资源
            is.close();
            sqlSession.close();
        }
    

    0x04、其他

    引入外部的properties属性文件

    实现

    <context:property-placeholder location="classpath:jdbc.properties"/>
    
    <!--1. 创建DataSource对象-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="driverClassName" value="${jdbc.driver}"></property>
    </bean>
    
  • 相关阅读:
    程序的跨平台性:除了能够运行,还必须保证运行的结果。
    任务并发执行是一个宏观概念,微观上是串行的。
    Swing与AWT在事件模型处理上是一致的。
    我们在学习JDBC的时候会过度到J2EE。
    AWT是Java最早出现的图形界面,但很快就被Swing所取代。
    在生成一个窗体的时候,点击窗体的右上角关闭按钮激发窗体事件的方法:窗体Frame为事件源,WindowsListener接口调用Windowsclosing()。
    在java.util中有EventListener接口:所有事件监听者都要实现这个接口。
    事件模型指的是对象之间进行通信的设计模式。
    经验之谈:Swing的开发工作会非常的累,而且这项技术正在走向没落。避免从事有这种特征的工作。
    重点掌握集合的四种操作:增加、删除、遍历、排序。
  • 原文地址:https://www.cnblogs.com/0x7e/p/14343062.html
Copyright © 2011-2022 走看看