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

    IOC注解方式快速入门

    1. 在spring4之后,想要使用注解形式,必须得要引入aop的包

    2. 在配置文件当中,还得要引入一个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">
    
    </beans>
    

    3. 配置组件扫描

    哪个包下的类型使用组合扫描

    <?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.xzh.spring.demo1"/>
    </beans>
    

    4. 在类开上添加注解

    必须在已经扫描包下

    package com.xzh.spring.demo1;
    
    import org.springframework.stereotype.Controller;
    
    @Controller("user")
    // 相当于配置文件中 <bean id="user" class="当前注解的类"/>
    public class User {
        public String name;
    }
    

    测试:

    @Test
    public void test() {
    
    	ApplicationContext applicationContext =
    			new ClassPathXmlApplicationContext("applicationContext.xml");
    
    	User user = (User) applicationContext.getBean("user");
    
    	System.out.println(user);
    }
    

    5. 使用注解注入属性

    (1)可以不用提供set方法,直接在直接名上添加@value("值")

    package com.xzh.spring.demo1;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Controller;
    
    @Controller("user")
    // 相当于配置文件中 <bean id="user" class="当前注解的类"/>
    public class User {
        @Value("IT666")
        // 相当于配置文件中 <property name="name" value="IT666"/>
        public String name;
    }
    

    测试:

    @Test
    public void test() {
    
    	ApplicationContext applicationContext =
    			new ClassPathXmlApplicationContext("applicationContext.xml");
    
    	User user = (User) applicationContext.getBean("user");
    
    	System.out.println(user);
    	System.out.println(user.name);
    }
    

    (2)如果提供了set方法,在set方法上添加@value("值");

    package com.xzh.spring.demo1;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Controller;
    
    @Controller("user")
    public class User {
        public String name;
    
        @Value("IT888")
        public void setName(String name) {
            this.name = name;
        }
    }
    

    测试同(1)

    IOC注解详解

    @Component

    修改一个类,将这个类交给Spring管理。相当于在配置文件当中配置

    <bean id=""  class="">
    

    @Component三个衍生注解

    为了更好的进行分层,Spring可以使用其它三个注解,功能类似,目前使用哪一个功能都一样, 后期可能会添加一些属于各自的属性。

    @Controller:web层
    @Service:service层
    @Repository:dao层

    @Controller("user")
    public class User {
        @Value("IT666")
        public String name;
    }
    
    @Service("user")
    public class User {
        @Value("IT666")
        public String name;
    }
    
    @Repository("user")
    public class User {
        @Value("IT666")
        public String name;
    }
    

    属性注入

    @Value

    设置普通属性值

    @Controller("user")
    public class User {
        @Value("IT666")
        public String name;
    }
    

    @Autowired

    (1)设置对象类型的属性值,直接使用这种方式,是按照类型完全属性注入,不需要在注解上使用id名称

    @Component("dog")
    public class Dog {
        @Value("旺财")
        public String name;
    }
    
    @Controller("user")
    public class User {
        @Value("IT666")
        public String name;
        @Autowired
        public Dog dog;
    }
    

    测试:

    @Test
        public void test() {
    
            ApplicationContext applicationContext =
                    new ClassPathXmlApplicationContext("applicationContext.xml");
    
            User user = (User) applicationContext.getBean("user");
    
            System.out.println(user);
            System.out.println(user.name);
            System.out.println(user.dog.name);
        }
    

    (2)习惯是按照名称完成属性注入,必须让@Autowired注解与@Qualifier一起使用

    @Component("dog")
    public class Dog {
        @Value("旺财")
        public String name;
    }
    
    @Controller("user")
    public class User {
        @Value("IT666")
        public String name;
        @Autowired
        @Qualifier("dog")
        public Dog dog;
    }
    

    测试代码同上。

    (3)单独使用@Resource,可以按照名称完成属性注入

    @Component("dog")
    public class Dog {
        @Value("旺财")
        public String name;
    }
    
    @Controller("user")
    public class User {
        @Value("IT666")
        public String name;
        @Resource(name = "dog")
        public Dog dog;
    }
    

    测试代码同上。

    @PostConstruct 和 @PreDestroy

    @PostConstruct 初始化方法,相当于

    <bean init-method=""></bean>
    

    @PreDestroy 销毁方法,相当于

    <bean destroy-method=""></bean>
    
    @Controller("user")
    public class User {
        @Value("IT666")
        public String name;
        @Resource(name = "dog")
        public Dog dog;
    
        @PostConstruct
        public void init(){
            System.out.println("init----初始化");
        }
    
        @PreDestroy
        public void destroy(){
            System.out.println("destroy----销毁");
        }
    }
    

    测试:

    @Test
    public void test() {
    
    	ApplicationContext applicationContext =
    			new ClassPathXmlApplicationContext("applicationContext.xml");
    
    	User user = (User) applicationContext.getBean("user");
    
    	System.out.println(user);
    	System.out.println(user.name);
    	System.out.println(user.dog.name);
    
    	((ClassPathXmlApplicationContext) applicationContext).close();
    }
    

    @scope

    作用范围

    • singleton:默认的,Spring会采用单例模式创建这个对象。关闭工厂 ,所有的对象都会销毁。
    • prototype:多例模式。关闭工厂 ,所有的对象不会销毁。内部的垃圾回收机制会回收。
    @Controller("user")
    @Scope("prototype")
    public class User {
        @Value("IT666")
        public String name;
        @Resource(name = "dog")
        public Dog dog;
    
        @PostConstruct
        public void init(){
            System.out.println("init----初始化");
        }
    
        @PreDestroy
    	// 作用范围定为多例,此方法不会调用
        public void destroy(){
            System.out.println("destroy----销毁");
        }
    }
    

    XML与注解比较

    • XML可以适用任何场景 ,结构清晰,维护方便
    • 注解不是自己提供的类使用不了,开发简单方便

    XML与注解整合开发

    • XML管理Bean
    • 注解完成属性注入
    • 使用过程中, 可以不用扫描,扫描是为了类上的注解

    在没有扫描的情况下, 使用属性注解@Resource @Value @Autowired @Qulifier

    <context:annotation-config/>
    
    public class Dog {
        @Value("旺财")
        public String name;
    }
    
    
    public class User {
        @Value("IT666")
        public String name;
        @Resource(name = "dog")
        public Dog dog;
    
        @PostConstruct
        public void init(){
            System.out.println("init----初始化");
        }
    
        @PreDestroy
        public void destroy(){
            System.out.println("destroy----销毁");
        }
    }
    

    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">
        <context:annotation-config/>
        <bean id="user" class="com.xzh.spring.demo1.User"/>
        <bean id="dog" class="com.xzh.spring.demo1.Dog"/>
    </beans>
    

    测试:

    @Test
    public void test() {
    
    	ApplicationContext applicationContext =
    			new ClassPathXmlApplicationContext("applicationContext.xml");
    
    	User user = (User) applicationContext.getBean("user");
    
    	System.out.println(user);
    	System.out.println(user.name);
    	System.out.println(user.dog.name);
    
    	((ClassPathXmlApplicationContext) applicationContext).close();
    }
    
  • 相关阅读:
    设置Linux环境的欢迎登陆信息
    负载均衡实现之随机数
    数据库连接池原理分析及模拟实现
    SpringBoot入门 (十四) Security安全控制
    SpringBoot入门 (十三) WebSocket使用
    SpringBoot入门 (十二) 定时任务
    SpringBoot入门 (十一) 数据校验
    SpringBoot入门 (十) 发送邮件
    SpringBoot入门 (九) MQ使用
    SpringBoot入门 (八) Cache使用
  • 原文地址:https://www.cnblogs.com/xzh0717/p/10843370.html
Copyright © 2011-2022 走看看