spring

    科技2025-04-17  8

    文章目录

    spring的作用为什么要进行bean对象的管理 spring环境搭建spring 的核心对象IOC控制反转的几种方法DI依赖注入的几种方法class类方式配置(AnnotationConfigApplicationContext)

    spring的作用

    spring是一套容器组件,用来管理项目中的bean对象(MVC-DAO四层对象)。是一个bean工厂,是一个bean的对象容器,通过ClasspathXMLApplicationContext来加载xml配置元数据文件初始化bean并装配bean的一个工具。

    为什么要进行bean对象的管理

    解决层与层之间耦合问题,层与层之间只依赖于抽象接口,不依赖于具体,下层变动,上层不动。

    MVC-dao每层都加了接口,都是为了代码的扩展性。

    要把具体的实现类的new的过程由我们自身来new,交给第三方的组件来new,把new出来的对象保存起来。在程序运行期间动态的给成员变量赋值。

    spring环境搭建

    加入spring的四个核心包;加入spring依赖的日志接口包:apache-common-logging配置spring的xml配置文件(applicationContext.xml)通过ClasspathXmlApplicationContext实现类来加载xml配置文件初始化spring容器。

    spring 的核心对象

    BeanFactory:加载本地的xml配置文件,把配置文件中配置的类实例化出来,保存。

    ApplicationContext:负责实例化,配置和组装Bean;通过动态代理,实现了AOP面向切面编程。

    ​ 两个实现类: ClasspathXMLApplicationContext:加载的xml元数据。在ssm项目中使用。AnnotationConfigApplicationContext:加载的注解配置类元数据。在springBoot项目使用。 WebApplicationContext:提供了对web上下文的支持,持有了ServletContext对象。

    IOC控制反转的几种方法

    控制反转:原来自己创建bean对象,交由spring来管理bean。

    包扫描

    // 启用包扫苗,识别类上的@Controller,@Service,@Repository,@Component,@Autowired。@Resource。@Qualifier <context:component-scan base-package="com.javasm"></context:component-scan> - @Service用于标注业务层组件 - @Controller用于标注控制层组件(如struts中的action) - @Repository用于标注数据访问组件,即DAO组件。 - @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。 - @Scope用于指定scope作用域的(用在类上) - @PostConstruct用于指定初始化方法(用在方法上) - @PreDestory用于指定销毁方法(用在方法上) - @Autowired用在成员变量或set方法上。 - @Resource用在成员变量或set方法上。 bean标签 <bean id=“自定义名称” class="类名" scope="singleton|prototype" init-method="方法名" destory-method="方法名" lazy-init="true|false"> <bean id="sysuserService1" class="com.javasm.sys.service.SysuserServiceImpl1" scope="prototype" init-method="init" destory-method="close"></bean> bean标签的常用属性 id:给bean命名,id必须唯一class:确定类的名称,类必须存在。scope:bean的范围,默认scope=“singleton单例”,可选prototype原型,request,session,applicationinit-method:初始化方法,在DruidDataSource对象中,需要 init-method=“init” destroy-method=“close”destory-method:销毁方法。lazy-init:延迟加载。getBean的时候才初始化bean对象,也是单例 静态工厂实例化bean public class StaticFactory { public static ICar createBmw(){ return new BMW(); } } // 得到的是creatBmw方法返回的对象,而非StaticFactory对象 <bean id="bmw" class="com.javasm.beanFactory.StaticFactory" factory-method="createBmw"></bean> 实例工厂方法实例化bean public class SqlSessionFactoryBean { public SqlSessionFactory createFactory(){ InputStream resourceAsStream =null; try { resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml"); } catch (IOException e) { e.printStackTrace(); } return new SqlSessionFactoryBuilder().build(resourceAsStream); } } <!--实例工厂--> <!--new SqlSessionFactoryBean().createFactory()--> <bean id="sqlSessionFactoryBean" class="com.javasm.beanFactory.SqlSessionFactoryBean"></bean> <bean id="sessionFactory" factory-bean="sqlSessionFactoryBean" factory-method="createFactory"></bean>

    DI依赖注入的几种方法

    bean对象不是独立存在的,都有依赖关系。spring要在程序运行期间,动态的维护对象的依赖关系(赋值)

    自动装配(配合包扫描一起使用)

    <context:component-scan base-package="com.javasm"></context:component-scan> -在java代码中使用@Autowired或@Resource注解方式进行装配,这两个注解的区别是: @Autowired 默认按类型装配, @Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。 基于set方法的注入 <bean id="sysuserController" class="com.javasm.controller.SysuserController" init-method="init"> <property name="属性名" ref="bean的id"></property><!--set注入--> </bean> // 示例 <bean id="orderDao" class="com.javasm.service.OrderDaoBean"/> <bean id="orderService" class=" com.javasm.service.OrderServiceBean"> <property name="orderDao" ref="orderDao"/><!--set注入--> </bean> 基于构造器注入 public SysuserServiceImpl(ISysuseDao useDao,String str) { this.useDao = useDao; this.str = str; } <bean id="us" class="com.javasm.service.SysuserServiceImpl"> <constructor-arg name="useDao" ref="userDao"></constructor-arg> <constructor-arg name="str" value="fyt"></constructor-arg> </bean> 内部bean注入 <bean class="com.javasm.mapper.SysUserDaoImpl" id="userDao"> <property name="ds"> // 没有id(name)属性,所以不能被其它引用 <bean class="com.alibaba.druid.pool.DruidDataSource"> </bean> </property> </bean>

    class类方式配置(AnnotationConfigApplicationContext)

    @Configuration // 表示该类是一个配置类 @PropertySource("druid.properties") // 加载配置文件 @ComponentScan("com.javasm") // 包扫描 public class AnnotationConfigTest { @Value("${driverClassName}") // 读取配置文件,给成员变量赋值 private String driver; @Value("${url}") private String url; @Value("${username}") private String username; @Value("${password}") private String password; @Bean(initMethod = "init",destroyMethod = "close") // 配置ioc,配置初始方法及摧毁方法 public DruidDataSource crateDruid(){ DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(driver); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); return dataSource; } @Bean @Scope("prototype") // 类比xml配置方式,方法名是id,形参是做di注入 public UserMapper crateUserMapper(DruidDataSource ds){ UserMapper userMapper = new UserMapperImpl(); ((UserMapperImpl) userMapper).setDs(ds); return userMapper; } } // 测试代码 ApplicationContext ac = new AnnotationConfigApplicationContext(AnnotationConfigTest .class); SpringConfig bean = ac.getBean(SpringConfig.class); bean.printInfo(); UserService bean = ac.getBean(UserService.class); bean.hello(); //销毁spring容器,会触发bean标签的destory-method与@PreDestory ac.registerShutdownHook();
    Processed: 0.010, SQL: 8