zoukankan      html  css  js  c++  java
  • JavaWeb学习:Spring5的IOC的注解

    一、注解

      ①、注解可以作用在类、方法、属性上

      ②、使用注解的目的:简化xml配置

    一、Spring的IOC的注解入门

      ①、创建web项目,引入jar

         

       ②、编写类

    public interface UserDao {
        public void save();
    }
    //注解中value属性值可以省略,默认值是首字母小写类名称
    @Component(value="userDao")//相当于 <bean id="userDao" class="com.xxx.spring.demo1.UserDaoImpl" 
    public class UserDaoImpl implements UserDao {
    
        @Override
        public void save() {
        System.out.println("UserDaoImpl的save方法执行了");
        }
    }

      ③、编写applicationContext.xml

        Ⅰ、编写约束

          通过spring-5.2.9.RELEASE-distspring-framework-5.2.9.RELEASEdocsspring-framework-reference下的index.html

           

          9.Appendix => 9.1.3.The context Schema 

           

    <?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 
            https://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context 
            https://www.springframework.org/schema/context/spring-context.xsd">
        
    </beans>

        Ⅱ、开启扫描

        <!--开启组件扫描
         若扫描多个包可用逗号隔开 或 使用上层目录 -->
        <context:component-scan    base-package="com.xxx.spring.demo1" />

      ④、编写测试

        @Test
        public void demo2() {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        
        UserDao dao=(UserDao) applicationContext.getBean("userDao");
        dao.save();
        }

    以下四个注解功能相同,都可以用来创建bean实例:

    @Component(修饰一个类,将这个类交给Spring管理)

    有以下三个衍生注解(功能类似),也是修饰类

    • @Service(用于对service层实现类进行标注,业务层)
    • @Controller(用于对Controller实现类进行标注,web层)
    • @Repository(用于对dao层实现类进行标注,持久层)

    二、属性注入

      ①、编写Service,并交给Spring管理

    public interface UserService {
        public void save();
    }
    @Service("userService")
    public class UserServiceImpl implements UserService {
        @Autowired
        private UserDao userDao;
        @Override
        public void save() {
        System.out.println("UserServiceImpl中的save方法执行了");
        userDao.save();
        }
    }

      ②、编写Dao

    //注解中value属性值可以省略,默认值是首字母小写的类名称
    @Repository(value = "userDao") // 相当于 <bean id="userDao" class="com.xxx.spring.demo1.UserDaoImpl"
    public class UserDaoImpl implements UserDao {
        @Value("zhangsan")//普通属性
        private String name;
    
        @Override
        public void save() {
        System.out.println("UserDaoImpl的save方法执行了" + name);
        }
    }

      ③、编写测试

        @Test
        public void demo3() {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        
        UserService service=(UserService) applicationContext.getBean("userService");
        service.save();
        }

    三、属性注解

      ①、普通属性:@Value

      ②、对象类型属性:

        Ⅰ、@Autowired:根据对象类型完成属性注入,不需要添加set方法

          @Autowired与 它修饰的属性的类型有关

        @Autowired
        private UserDao userDao;

           与spring管理的id或name无关

    @Repository(value = "userDao") // 相当于 <bean id="userDao" class="com.xxx.spring.demo1.UserDaoImpl"
    public class UserDaoImpl implements UserDao {

         Ⅱ、@Qualifier:根据属性名称进行注入,这个注解的使用要和@Autowired一起使用 

        @Autowired
        @Qualifier(value = "userDao")
        private UserDao userDao;

        Ⅲ、@Resource:可以根据类型注入,也可以根据名称注入(JDK11以后完全移除了javax扩展导致不能使用@resource注解)

        //根据类型
        @Resource(type = UserDao.class)
        private UserDao userDao;
        
        //根据名称或ID
        @Resource(name = "userDao")
        private UserDao userDao;

    四、其他注解

    @Service("customerService")//<bean id="customerService" class="" init-method="init" destroy-method="destroy">
    @Scope(scopeName = "singleton")//默认单例
    /*
     * @Scope(scopeName = "prototype")//多列
     * 
     * @Scope(scopeName = "request")
     * 
     * @Scope(scopeName = "session")
     * 
     * @Scope(scopeName = "globalSession")
     */
    public class CustomerService {
        @PostConstruct//相当于 init-method="init"
        public void init() {
        System.out.println("CustomerService init方法执行");
        }
        
        public void save() {
        System.out.println("CustomerService save方法执行");
        }
        
        @PreDestroy // 相当于 destroy-method="destroy"
        public void destroy() {
        System.out.println("CustomerService destroy方法执行");
        }
    }
        @Test
        public void demo1() {
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(
                                                      "applicationContext.xml"); CustomerService service = (CustomerService) applicationContext.getBean("customerService"); service.save(); applicationContext.close(); }

    五、完全注解开发

      ①、创建配置类替代XML配置文件 (使用注解@Configuration@ComponentScan)

    @Configuration //作为配置类替代xml配置文件
    @ComponentScan(basePackages = {"com.xxx.spring.demo3"}) //开启组件扫描
    public class SpringConfig {
    
    }

      ②、创建Dao类,并交给Spring管理

    public interface UserDao {
    
        public void find();
    }
    @Repository("userDao")
    public class UserDaoImpl implements UserDao {
    
        @Value("姓名")
        private String name;
    
        @Override
        public void find() {
        System.out.println("UserDaoImpl find方法执行" + name);
        }
    }

      ③、创建Service类,并交给Spring管理

    public interface UserService {
        public void find();
    }
    @Service("userService")
    public class UserServiceImpl implements UserService {
        @Autowired
        @Qualifier("userDao")
        private UserDao userDao;
        @Override
        public void find() {
        System.out.println("UserServiceImpl find方法执行");
        userDao.find();
        }
    }

      ④、编写测试方法

        @Test
        public void demo() {
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        UserService service=(UserService) context.getBean("userService");
        service.find();
        }

    六、XML和注解整合开发

      XML负责类(将类交给Spring管理),注解负责类中的属性(属性注入)

      ①、新建Service和Dao

    public class ProductDao {
        @Value("商品名称")
        private String productName;
    
        public void find() {
        System.out.println("ProductDao find方法执行" + productName);
        }
    }
    
    public class OrderDao {
        @Value("订单编号")
        private String orderNo;
    
        public void find() {
        System.out.println("OrderDAO find方法执行" + orderNo);
        }
    }
    
    public class ProductService {
        @Autowired
        @Qualifier("productDao")
        private ProductDao productDao;
        @Resource(name = "orderDao")
        private OrderDao orderDao;
    
        public void find() {
        System.out.println("ProductService find方法执行了");
        productDao.find();
        orderDao.find();
        }
    }

      ②、将Bean交给Spring管理

        <!-- 将bean交给Spring管理 -->
        <bean id="productService" class="com.xxx.spring.demo4.ProductService"></bean>
        <bean id="productDao" class="com.xxx.spring.demo4.ProductDao"></bean>
        <bean id="orderDao" class="com.xxx.spring.demo4.OrderDao"></bean>

      ③、开启允许使用属性注解

        <!--开启组件扫描
         若扫描多个包可用逗号隔开 或 使用上层目录(针对类进行扫描-->
        <!-- <context:component-scan    base-package="com.xxx.spring.demo1,com.xxx.spring.demo2" /> -->
        
        <!-- 在没有扫描的情况下,使用属性注入的注解 -->
        <context:annotation-config/>

      ④、编写测试方法

        @Test
        public void demo1() {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        ProductService productService=(ProductService) applicationContext.getBean("productService");
        productService.find();
        }
  • 相关阅读:
    css控制英文内容自动换行問題
    jquery添加select option两种代码思路比较
    C++实现单例模式
    C++实现单例模式
    windows下socket编程:区分shutdown()及closesocket()
    windows下socket编程:区分shutdown()及closesocket()
    socket关闭
    socket关闭
    C++模板的一些巧妙功能
    C++模板的一些巧妙功能
  • 原文地址:https://www.cnblogs.com/WarBlog/p/14109661.html
Copyright © 2011-2022 走看看