首页 > 其他分享 >Spring基础使用四

Spring基础使用四

时间:2022-10-25 21:46:57浏览次数:38  
标签:Spring 基础 bean wfy 使用 import com public UserService

Spring基础使用四

FactoryBean

概念:

FactoryBean是一个接口,需要创建一个类实现该接口

其中有三个方法:

  • getObject( ): 通过一个对象交给IOC容器处理
  • getObjectType(): 设置所提供对象的类型
  • isSingleton(): 所提供的对象是否单例

注意:

当把FactoryBean的实现类配置为bean时,会将当前类中getObject()所返回的对象交给IOC容器管理

package com.wfy.pojo;
import org.springframework.beans.factory.FactoryBean;
public class UserFactoryBean  implements FactoryBean<User> {
    @Override
    public User getObject() throws Exception {
        return new User();
    }
    @Override
    public Class<?> getObjectType() {
        return User.class;
    }
}
<?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 class="com.wfy.pojo.UserFactoryBean"></bean>

</beans>
package com.wfy.spring;

import com.wfy.pojo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class FactoryBeanTest {
    @Test
    public void FactoryBean(){
        ApplicationContext ioc =  new ClassPathXmlApplicationContext("spring-factory.xml");
        User bean = ioc.getBean(User.class);
        System.out.println(bean);
    }
}

结果:

基于xml的自动装配

自动装配:

根据指定的策略,在IOC容器中匹配某一个bean,自动为指定的bean中所依赖的类类型或接口类型属性赋值

可以通过bean标签中的autowire属性设置自动装配的策略

自动装配的策略:

autowire=" no/default" : 表示不装配,即bean中的属性不会自动匹配某个bean为属性赋值,此时属性使用默认值

autowrie="byType" : 根据要赋值的属性的类型,在IOC容器中匹配某个bean,为属性赋值

注意:

  • 若通过类型没有找到任何一个类型匹配的bean,此时不装配,属性使用默认值
  • 若通过类型找到了多个类型匹配的bean,此时就会抛出异常:NoUniqueBeanDefinitionException

总结:当使用byType实现自动装配时,IOC容器中有且只有一个类型匹配的bean能够为属性赋值

autowire="byName" : 将要赋值的属性的属性名作为bean的id在IOC容器中匹配某个bean,为属性赋值

总结:当类型匹配的bean有多个时,此时可以使用byName实现自动装配

通过三层架构进行演示:

一、创建Controller(Servlet)层

package com.wfy.controller;

import com.wfy.service.UserService;
import com.wfy.service.impl.UserServiceImpl;

public class UserController {
    private UserService userService ;

    public UserService getUserService() {
        return userService;
    }

    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    public void saveUser(){
        userService.saveUser();
    }
}

二、Service层

package com.wfy.service;

public interface UserService {

    //保存用户信息
    void saveUser();
}
package com.wfy.service.impl;

import com.wfy.dao.UserDao;
import com.wfy.service.UserService;

public class UserServiceImpl implements UserService {

    private UserDao  userDao ;

    public UserDao getUserDao() {
        return userDao;
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void saveUser() {
        userDao.saveUser();
    }
}

三、Dao层

package com.wfy.dao;

public interface UserDao {

    //保存用户信息
    void saveUser();
}
package com.wfy.dao.impl;
import com.wfy.dao.UserDao;
import com.wfy.service.UserService;


public class UserDaoImpl implements UserDao {
     private UserService userService;

    public UserService getUserService() {
        return userService;
    }

    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    @Override
    public void saveUser() {
        System.out.println("保存成功~");
    }
}

四、配置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="userController" class="com.wfy.controller.UserController" autowire="byType">
<!--        <property name="userService" ref="userService"></property>-->
    </bean>

    <bean  id="userService" class="com.wfy.service.impl.UserServiceImpl" autowire="byType">
<!--        <property name="userDao" ref="userDao"></property>-->
    </bean>
    <bean id="userDao"  class="com.wfy.dao.impl.UserDaoImpl"></bean>
</beans>

五、案例测试

package com.wfy.spring.Test;

import com.wfy.controller.UserController;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AutowireByXMLTest {
    /**
     *
     */

    @Test
    public void AutowireTest(){
        ApplicationContext  ioc = new ClassPathXmlApplicationContext("spring-autowire.xml");
        UserController userController = ioc.getBean(UserController.class);
        userController.saveUser();
    }
}

基于注解管理Bean

标识组件的常见注解

  • @Component: 将类标识为普通组件
  • @Controller: 将类标识为控制层组件
  • @Service: 将类标识为业务层组件
  • @Repository: 将类标识为持久层组件

案例展示

Controller:

package com.wfy.controller;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
}

Service:

package com.wfy.service;
public interface UserService {
}
package com.wfy.service.impl;
import com.wfy.service.UserService;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
}

Dao:

package com.wfy.dao;
public interface UserDao {
}
package com.wfy.dao.impl;
import com.wfy.dao.UserDao;
import org.springframework.stereotype.Repository;
@Repository
public class UserDaoImpl implements UserDao {
}

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

<!--扫描组件-->
    <context:component-scan base-package="com.wfy"></context:component-scan>
</beans>

测试:

package com.wfy.spring.Test;

import com.wfy.controller.UserController;
import com.wfy.dao.UserDao;
import com.wfy.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class IOCByAnnotationTest {
    @Test
    public void IOCByAnnotationTest(){
        ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-annotation.xml");
        UserController controller = ioc.getBean(UserController.class);
        System.out.println(controller);
        UserDao userDao = ioc.getBean(UserDao.class);
        System.out.println(userDao);
        UserService userService = ioc.getBean(UserService.class);
        System.out.println(userService);
    }
}

结果:

XML文件中的标签属性

  • context:exclude-filter: 排除扫描
  • type: 设置排除扫描的方式
  • type="annotation/assignable"
  • annotation: 根据注解的类型进行排除,expression需要设置排除的注解的全类名
  • assignable: 根据类的类型进行排除,expression需要设置排除的类的全类名
  • context:include-filter: 包含扫描
  • 注意:需要在context:component-scan标签中设置use-default-filters="false"
  • use-default-filters="true"(默认情况下) ,所设置的包下的所有类都需要扫描,此时可以使用排除扫描
  • use-default-filters="false",所设置的包下的所有类都不需要扫描,此时可以使用包含扫描

通过注解+扫描所配置的bean的id,默认值为类的小驼峰,即类名的首字母为小写结果

在注解中可以设置别名来重新定义,即可以通过标识组件的注解的value属性值定义bean的自定义id

标签:Spring,基础,bean,wfy,使用,import,com,public,UserService
From: https://www.cnblogs.com/wfy-studying/p/16826392.html

相关文章

  • Day4:Python基础:元祖方法一
    1、元祖打印Tu=(1,2,3,'Alex',[2,3,4,'taibai'],'egon')print(Tu[3])2、元祖字符转大写Tu=(1,2,3,'Alex',[2,3,4,'taibai'],'egon')Tu[4][3]=Tu[4][3].upp......
  • 嵌入式-C语言基础:
    在C语言中,数组名代表数组中首元素的地址,所以,下面两句获取数组的首地址是等价的:#include<stdio.h>intmain(){inta[5]={1,2,3,4,5};int*p=&a[0];int......
  • C++ 面向对象高级开发 基础篇(二)
    操作符重载C2就是this传递者不用知道是否returnbyreference 非成员函数(全局函数)的操作符重载(有几种用法就写几种重载)不能使用returnbyreference因为他们得......
  • this关键字除了在实例方法中,也可以使用在构造方法中
    //this除了可以使用在实例方法中,还可以使用在构造方法中/*需求:1.定义一个日期类,可以表示年月日信息2.需求中要求:如果调用无参数构造方法,默认创建的......
  • 现代处理器设计 超标量处理器基础 电子书 pdf
    作者:JohnPaulShen出版社:电子工业出版社原作名:ModernProcessorDesign:FundamentalsofSuperscalarProcessors 链接:现代处理器设计超标量处理器基础  ......
  • 2022计算机基础与程序设计
    目录作业要求作业提交地址作业提交情况情况较上周有退步,上周未提交7人,这周未提交10人作业内容要求学习目标总结要求作业情况优点缺点优秀作业助教小结作业要求作业提交地......
  • 【2022.10.25】Vue基础学习(2)
    今日详情1.style和class2.条件渲染3.列表渲染3.1v-for循环数组,循环字符串,数字,对象3.2数组的检测与更新4.双向数据绑定5.事件处理5.1过滤案例5.2事件修饰......
  • 【Java[类的创建与使用]】7-3 学生类定义
    定义一个Student类,含类成员变量:Stringname、Stringgender、intscore、booleanaward,所有的变量为私有(private)。1.编写有参构造函数:对name、gender、score、award赋......
  • java基础
    java基础注释单行注释//多行注释/**/文本注释/***/关键字标识符是大小写敏感的数据类型强类型语言基本类型byteshortintlong(数字后面加L)float......
  • 【Java[类的创建与使用]】7-4 设计一个"无名的粉"类
    为“无名的粉”写一个类:classWuMingFen要求:有三个属性:面码:StringtheMa粉的分量(两):intquantity是否带汤:booleanlikeSoup;写一个构造方法,以便于简化初始化过程,如:......