zoukankan      html  css  js  c++  java
  • Spring 基于注解的 IOC 配置

    创建 spring 的 的 xml 配置 文件

    <context:component-scan base-package="com.itheim"/> 指定创建容器时要扫描的包

    <?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">
    
        <context:component-scan base-package="com.itheim"/>
    
    </beans>
    

    常用注解

    用于创建对象的

    @Component

    相当于: <bean id="" class="">

    作用:
    把资源让 spring 来管理。相当于在 xml 中配置一个 bean。
    属性:
    value:指定 bean 的 id。如果不指定 value 属性,默认 bean 的 id 是当前类的类名。首字母小写
    

    @Controller @Service @Repository

    他们三个注解都是针对一个的衍生注解,他们的作用及属性都是一模一样的。
    他们只不过是提供了更加明确的语义化。
    @Controller :一般用于表现层的注解。
    @Service :一般用于业务层的注解。
    @Repository :一般用于持久层的注解。
    细节:如果注解中有且只有一个属性 要赋值时是 ,且名称是 value ,value 在赋值是可以不写。
    

    用于注入数据的

    相当于: <property name="" ref=""><property name="" value="">

    @Autowired

    作用:
    自动按照类型注入。当使用注解注入属性时,set方法可以省略。它只能注入其他 bean 类型。当有多个
    类型匹配时,使用要注入的对象变量名称作为 bean 的 id,在 spring 容器查找,找到了也可以注入成功。找不到
    就报错。
    

    @Qualifier

    作用:
    在自动按照类型注入的基础之上,再按照 Bean 的 id 注入。它在给字段注入时不能独立使用,必须和
    @Autowire 一起使用;但是给方法参数注入时,可以独立使用。
    属性:
    value:指定 bean 的 id。
    

    @Resource

    作用:
    直接按照 Bean 的 id 注入。它也只能注入其他 bean 类型。
    属性:
    name:指定 bean 的 id。
    

    @Value

    作用:
    注入基本数据类型和 String 类型数据的
    属性:
    value:用于指定值  value值的方式  ${jdbc.url} 
    

    用于改变作用范围的:

    相当于: <bean id="" class="" scope="">

    @Scope

    作用:
    指定 bean 的作用范围。
    属性:
    value:指定范围的值。
    取值:singleton prototype request session globalsession

    和生命周期相关的:( 了解)

    相当于: <bean id="" class="" init-method="" destroy-method="" />

    @PostConstruct

    用于指定初始化方法
    

    @PreDestroy

    用于指定销毁方法
    

    关于 Spring 注解和 XML 的选择问题

    注解的优势:
    配置简单,维护方便(我们找到类,就相当于找到了对应的配置)。
    XML 的优势:
    修改时,不用改源码。不涉及重新编译和部署。
    Spring 管理 Bean 方式的比较:
    

    案例

    通过注解实现从数据库查询信息

    bean.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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean id="accountService" class="com.itheim.service.Imp.accountServiceImp">
            <property name="dao" ref="dao"/>
        </bean>
        <bean id="dao" class="com.itheim.dao.Imp.accountDaoImp">
            <property name="runner" ref="runner"/>
        </bean>
        <bean id="runner" class="org.apache.commons.dbutils.QueryRunner" scope="prototype">
            <constructor-arg name="ds" ref="ds"/>
        </bean>
        <!-- 配置数据源-->
        <bean id="ds" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="driverClass" value="com.mysql.jdbc.Driver"/>
            <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/eesy_mybatis"/>
            <property name="user" value="root"/>
            <property name="password" value="root"/>
        </bean>
    
         
    </beans>
    

    使用Service注解配置管理资源

    /**
    * 账户的业务层实现类
    * @author
    * @Company 
    * @Version 1.0
    */
    @Service("accountService")
    public class accountServiceImp implements accountService {
        private accountDao dao;
        static {
            System.out.println("service创建完成");
        }
    
        public void setDao(accountDao dao) {
            this.dao = dao;
        }
    
        public List<Account> findAll() {
            return dao.findAll();
        }
    
        public void Update(int id) {
            dao.Update(id);
        }
    
        public void saveUser(Account account) {
            dao.saveUser(account);
    
        }
    }
    
    
    /**
    * 账户的持久层实现类
    * @author 
    * @Company 
    * @Version 1.0
    */
    public class accountDaoImp implements accountDao {
        private QueryRunner runner;
    
        public void setRunner(QueryRunner runner) {
            this.runner = runner;
        }
    
        public List<Account> findAll() {
            try {
                String sql="select * from account";
                return runner.query(sql,new BeanListHandler<Account>(Account.class));
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    
        public void Update(int id) {
            try {
                String sql="update account set money=? where id=? ";
                runner.update(sql,7000,id);
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    
        public void saveUser(Account account) {
            try {
                String sql="insert into account(money) values(?)";
                runner.update(sql,account.getMoney());
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
    

    注意:
    1、当我们使用注解注入时,set 方法不用写

    编写测试类

    @Test
        public void springTest(){
            ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
            accountService service = (accountService) context.getBean("accountService");
            Account account = (Account) context.getBean("account");
            List<Account> list = service.findAll();
            System.out.println(list);
            account.setMoney(6000);
            service.saveUser(account);
        }
    

    pom.xml下的配置为

    <dependencies>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.6</version>
            </dependency>
            <!--导入spring依赖jar包-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.0.2.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
            <dependency>
                <groupId>c3p0</groupId>
                <artifactId>c3p0</artifactId>
                <version>0.9.1.2</version>
            </dependency>
            <dependency>
                <groupId>commons-dbutils</groupId>
                <artifactId>commons-dbutils</artifactId>
                <version>1.7</version>
            </dependency>
        </dependencies>
    
  • 相关阅读:
    python中自定义模块导入
    EditText------Android
    Fragment类实现
    Android文件访问
    python中pip使用国内镜像提高安装速度
    esri/geometry包 (arcgis api for js)
    【CSDN 编辑器 MarkDowm 使用技巧】
    for 循环 :从指定下标开始,并指定步长
    【车牌识别】-车牌中字符分割代码详解
    【 Linux 常用命令】
  • 原文地址:https://www.cnblogs.com/zgrey/p/13358715.html
Copyright © 2011-2022 走看看