zoukankan      html  css  js  c++  java
  • Spring注解

    完全使用注解在开发中并不是特别多,但是在框架整合的时候往往会用到注解的方式。

    IOC装配Bean(使用注解的方式):

    Spring2.5中引入了使用注解去定义Bean:

    @Component描述Spring框架中的Bean。

    实例讲解注解

    首先,

    编写一个Dao

    package com.js.demo1;
     
    import org.springframework.stereotype.Repository;
    
    @Repository("userDao")
    public class UserDao {
        
    }

    编写一个bean

    package com.js.demo1;
     
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    import javax.annotation.Resource;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Component;
    import org.springframework.stereotype.Service;
    /**
     * 注解的方式装配bean
     * @author hdb
     *
     */
    //@Component("userService")
    @Service("userService")
    @Scope
    public class UserService {
        @Value(value="小蒋")
        private String info;
        
    //    @Autowired
    //    @Qualifier("userDao")
        @Resource(name="userDao")
        private UserDao userDao;
        
        @Override
        public String toString() {
            return "UserService [info=" + info + ", userDao=" + userDao + "]";
        }
     
        public void sayHello(){
            System.out.println("Hello Spring annotation..."+info);
        }
    
        @PostConstruct
        public void setup(){
            System.out.println("初始化...");
        }
        @PreDestroy
        public void teardown(){
            System.out.println("销毁...");
        }
    
    }

    然后,修改applicationContext.xml(为什么还需要配置文件呢?是为了告诉Spring应该去哪些包下扫描使用注解配置的bean),配上xmlns:context:

    <?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:annotation-config></context:annotation-config>
    </beans>

    接下来,配置context:component-scan,告诉Spring需要扫描哪些包:

    <?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">
    <!-- 纯用注解配置bean的情况下context:annotation-config可以省略,当混合使用xml和注解配置bean的时候就不能省略了-->
    <context:annotation-config></context:annotation-config>
    <!-- 配置扫描注解的包 -->
    <context:component-scan base-package="com.js"></context:component-scan>
    </beans>

    编写测试类

    package com.js.demo1;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.AbstractApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
     
    public class TestAnnotation {
        @Test
        public void demo1(){
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
            UserService userService = (UserService)applicationContext.getBean("userService");
            UserService userService2 = (UserService)applicationContext.getBean("userService");
            userService.sayHello();
            System.out.println("userService:"+userService);
            System.out.println("userService2:"+userService2);
            ((AbstractApplicationContext) applicationContext).close();
        }
    }

    @Component

    除了@Component之外,Spring还提供了与之等效的三个注解(为了以后分层开发):

    @Repository:用于对DAO实现类进行标注

    @Service:用于对Service实现类进行标注

    @Controller:用于对Controller实现类进行标注

    普通属性(使用@Value注解):@Value

    对象属性(使用@Autowired [ˈɔ:təʊwaɪəd]注解,默认使用类型注入):@Autowired

    @Autowired可以带参数,required,默认为true,表示不忽略异常。

    @Autowired(required=false)表示忽略异常。

    @Qualifier(命名)ˈkwɒlɪfaɪə(r)]

    一般情况下我们使用名称注入,也就是需要给UserDao的@Repository注解加上名称,

    例如:@Repository("userDao"),然后在@Autowired注解下再加一个@Qualifier("userDao")去装配,注意名称要一致,否则注入失败

    Spring默认使用类型注入,也就是此处的UserDao类型会默认匹配UserDao这个bean。

    简言之,按名称注入:@Repository(命名)+@Autowired+@Qualifier(命名),按类型注入:@Repository+@Autowired

    @Resource注解和@Autowired+@Qualifier(命名)功能有点类似:

    例如上述例子中UserService中的注解:

    @Autowired(required=false)
    @Qualifier("userDao")
    private UserDao userDao;

    可以改写为:

    @Resource(name="userDao")
    private UserDao userDao;

    运行同样成功。

    Spring可以在创建和卸载bean的时候调用bean的两个生命周期方法:

    <bean id="product" class="com.js.demo4.Product" init-method="setup" destroy-method="teardown"/>

    这是之前我们采用xml配置的方式,采用注解方式可以实现同样的操作:

    @PostConstruct:初始化
    @PreDestroy:销毁
    配置bean的作用范围:
    用xml方式:
    <bean id="customer" class="com.js.demo3.Customer" scope="prototype"></bean>
    用注解方式:@Scope,默认值同样为:单例的
    @Service("userService")
    @Scope
    public class UserService {
    //        省略代码
    }

    实际开发中使用XML还是注解?

    XML:

    * bean管理

    注解;

    * 注入属性的时候比较方便.

    两种方式结合:一般使用XML注册Bean,使用注解进行属性的注入

    在applicationContext.xml中配置

    <!-- 纯用注解配置bean的情况下context:annotation-config可以省略,当混合使用xml和注解配置bean的时候就不能省略了-->

    <!-- 作用是使@Resource、@PostConstruct、@PreDestroy、@AutoWired生效-->

    <context:annotation-config></context:annotation-config>

    XML注册Bean,注解属性注入实例

    首先,

    编写一个Dao:

    package com.js.demo4;
    
    import org.springframework.stereotype.Repository;
     
    @Repository("0rderDao")
    public class OrderDao {
     
    }
    package com.js.demo4;
    
    import org.springframework.stereotype.Repository;
     
    @Repository("customerDao")
    public class CustomerDao {
     
    }

    编写一个bean:

    使用注解传入的属性就不在需要setter方法,也不再需要Component-scan

    package com.js.demo4;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
     
    public class CustomerService {
        //注解进行属性注入
        @Autowired
        @Qualifier("customerDao")
        private CustomerDao customerDao;
        
        @Autowired
        @Qualifier("orderDao")
        private OrderDao orderDao;
        
        @Override
        public String toString() {
            return "CustomerService [customerDao=" + customerDao + ", orderDao="
                    + orderDao + "]";
        }
        
    }

    修改applicationContext.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">
    
    <!-- 纯用注解配置bean的情况下context:annotation-config可以省略,当混合使用xml和注解配置bean的时候就不能省略了-->
    <!-- 作用是使@Resource、@PostConstruct、@PreDestroy、@AutoWired生效-->
    <context:annotation-config></context:annotation-config>
    
    <bean id="customerDao" class="com.js.demo4.CustomerDao"></bean>
    <bean id="orderDao" class="com.js.demo4.OrderDao"></bean>
    <bean id="customerService" class="com.js.demo4.CustomerService">
    </bean>
    
    </beans>

    编写测试类

    package com.js.demo4;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class TestXmlAnnation {
        
        @Test
        public void demo(){
            ApplicationContext applicationContext =new ClassPathXmlApplicationContext("applicationContext.xml");
            CustomerService customerService = (CustomerService) applicationContext.getBean("customerService");
            System.out.println("customerService:"+customerService);
        }
    }
  • 相关阅读:
    解决.net core 3.1 json日期带T的问题
    C# 将指定得时间转换成秒
    WPF Button按钮的按下和抬起分别触发的事件
    WPF Image图片后台绑定图片,不对图片照成占用
    WPF Textbox漂亮的文本控件框封装
    WPF Slider实现可拖动的时间轴
    .net mvc 下显示PDF文件
    .net core 3.1使用命令自动生成MySQL表对应的实体类
    .net core A generic error occurred in GD 已解决
    WPF 模拟Button按钮事件触发
  • 原文地址:https://www.cnblogs.com/huangdabing/p/9482954.html
Copyright © 2011-2022 走看看