Spring 初级入门

核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。

Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能集成到了 Spring 框架中。可以将一些通用任务,如安全、事务、日志等集中进行管理,提高了复用性和管理的便捷性。

Spring DAO:为JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。

Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。

Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。

Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

1、工厂模式初见:

在以往java开发时,我们想要创建对象都是直接new,业务层调用持久层时,就需要在业务层new出持久层的对象,增加两层的耦合

//        工厂方法解耦 java代码实现思路
//        业务层
//        A接口      定义业务方法名
//        D实现类  实现A接口方法
//
//        持久层
//        B接口      定义持久方法名
//        F实现类  实现B接口方法
//
//        D、F通过工厂方法创建对象,然后用用接口指向对应生成的对象,仅仅通过接口实现对应的方法互相调用,而具体的实现类则被解耦,在编译时,就算实现类被删除不存在也不会产生错误

2、spring基础模式

xml文件






    

        
        


        
    

    
    


    




        
    


    
        

            
                1
                2
            








        
        

            
                value
                value2
            




        
    

























































    









    
    









    


java代码:

//        1、根据核心容器获取对象,配置文件读取后,对象即被创建出来
//        FileSystemXmlApplicationContext       获取本地磁盘下的文件
//        ClassPathXmlApplicationContext        获取类路径下文件
//        AnnotationConfigApplicationContext

        //配置文件读取后,对象即被创建出来
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");

//        直接使用构造方法创建对象
        User user = (User) ac.getBean("userspring");
        user.test();
        User user2 = (User) ac.getBean("userspring");
        user2.test();

//        使用工厂类的方法返回对象
        User factoryMethodUser = (User)ac.getBean("usersping2");

//        使用工厂类的静态方法返回对象
        User staticfactoryMethodUser = (User)ac.getBean("userstatic");


//        2、根据BeanFactory获取对象
        Resource resource = new ClassPathResource("bean.xml");
        BeanFactory beanFactory = new XmlBeanFactory(resource);
        User beanfactoryUser = (User)beanFactory.getBean("userspring");
        beanfactoryUser.test();
        User beanfactoryUser2 = (User)beanFactory.getBean("userspring");
        beanfactoryUser2.test();

总结:


    




        
    


    
        
            
                1
                2
            








        
    

3、spring注解模式





    


java类声明

//指定id为指定字符串
//@Component(value = "annotation")
//默认id为类名第一字母小写
//通用
@Component
//表现层
@Controller
//服务层
@Service
//持久层
@Repository
public class SpringAnnotation {
    public SpringAnnotation(){
        System.out.println("对象被创建了");
    }
}

成员属性注入(存在的问题,使用注解注入成员属性,不方便传参,如果成员属性是另一个bean对象,因为是@Autowired,不方便用指定的参数注入这个bean对象)

//指定id为指定字符串
//@Component(value = "annotation")
//默认id为类名第一字母小写
//通用
@Component
////表现层
//@Controller
////服务层
//@Service
////持久层
//@Repository

//singleton单例 prototype多例
@Scope("singleton")

public class SpringAnnotation {
//    有唯一的bean对象类型和要注入的数据相同,则注入成功
//    注入逻辑 IOC是map接口 beanid为key value为类
//    @Autowired 先根据类的类型去IOC的map结构中查找相同类型的类,如果类是唯一的则直接注入,
//    如果有多个类(包括接口被多个类实现、类被多个子类继承均为多个类!!!),则拿变量名作为beanid,继续在同类型的类中,找到beanid相同的类进行注入
    @Autowired
//    public AutowiredValue autowiredValue;
    public AutowiredValue autowiredValueSon;

//    但是如果有多个类,变量名我们又想任意去取时,这时候我们要再加入一个注入指明注入的beanid
    @Autowired
    @Qualifier("autowiredValueSon")
    public AutowiredValue aaaaa;

//    基本数据类型和String类型数据的注入
    @Value("66666")
    public String bbbb;

    public SpringAnnotation(){
        System.out.println("对象被创建了");
    }
}

4、spring新注解(摒弃繁重的xml文件 将配置换为类)

知识点①,@Bean(name = "BinSpring"),用于方法上的注解,对方法返回值进行beanid的管理,原来的注解配置本来是要在每个类前面加入注解,导致注解非常分散,不易管理,有了该注解,就可以将注解集中起来,通过方法回调为对象加入注解,并且我们可以在这个地方很方便地进行传参
注:之前的@Component注解属于类注解,直接作用于类名上,缺点就是分散

    @Bean(name = "BinSpring")
    public BinSpring createBinSpring(){
        return new BinSpring();
    }

将类注解为配置文件,替换xml

//声明该类为配置类
@Configuration
//扫描注解范围,如果不想通过@Bean统一管理,则还是按原来的在类上进行注解,则需要配置scan,才能正常使用
@ComponentScan("com.momi")

public class ConfigClass {

//    通过@Bean统一管理
    @Bean(name = "binSpring")
    @Scope("singleton")
    public BinSpring createBinSpring(){
        return new BinSpring();
    }

    @Bean(name = "binBean")
    @Scope("prototype")
    public BinBean createBinBean(){
        return new BinBean();
    }
}
AnnotationConfigApplicationContext acac = new AnnotationConfigApplicationContext(ConfigClass.class);

BinBean binBean = (BinBean) acac.getBean("binBean");
BinSpring binSpring = (BinSpring) acac.getBean("binSpring");

随着工程越做越大,我们对应的config类代码也会原来越多,那么就需要进行进一步的分解,使用多个config类,比如aconfig负责业务层,bconfig负责服务层...

//声明该类为配置类
@Configuration
//扫描注解范围,如果不想通过@Bean统一管理,则还是按原来的在类上进行注解,则需要配置scan,才能正常使用
@ComponentScan("com.momi")
//导入另一个配置类
@Import(ConfigB.class)
public class ConfigClass {

//    通过@Bean统一管理
    @Bean(name = "binSpring")
    @Scope("singleton")
    public BinSpring createBinSpring(){
        return new BinSpring();
    }

    @Bean(name = "binBean")
    @Scope("prototype")
    public BinBean createBinBean(){
        return new BinBean();
    }
}
public class CBean {
    public CBean(){
        System.out.println("CBean 创建了" + this);
    }
}
@Configuration
public class ConfigB {

    @Bean(name = "cbean")
    @Scope("prototype")
    public CBean createCBean(){
        return new CBean();
    }

}

5、注解模式获取property文件数据

(to do...
@PropertySource 获取property文件的路径问题 )
在config类中,添加@PropertySource("classpath:values.properties")

@Configuration
@PropertySource("classpath:values.properties")
    public class ConfigB {

    @Bean(name = "cbean")
    @Scope("prototype")
    public CBean createCBean(){
        return new CBean();
    }

}

在对象类中结合@Value实现数据注入

public class CBean {
//    @Value用户String和基本数据注入
    @Value("${name}")
    private String name;
    @Value("${password}")
    private Integer password;
    @Value("${age}")
    public Integer age;

    public CBean(){
        System.out.println("CBean 创建了" + this);
    }
}

5-1、使用配置类,如何实现xml文件配置的ref功能,即一个类创建需要另一个类作为参数

@Configuration
@PropertySource("classpath:values.properties")
public class ConfigB {

    @Bean(name = "cbean")
    @Scope("prototype")
//    这里的 CBeanPara cBeanPara 参数自动注入依照类似autowired规则进行注入 先匹配类型,有同样类型的匹配用变量名匹配bean名/使用Qualifier指定bean名
//    注:先去查类型为CBeanPara的bean对象,如果有多个则使用cbpara 去匹配bean名(value)/或者使用使用Qualifier直接指定bean名
    public CBean createCBean(@Qualifier("para1") CBeanPara cbpara) {
        return new CBean();
    }

    @Bean(value = "para1")
    @Scope(value = "prototype")
    public CBeanPara createPara(){
        CBeanPara cBeanPara = new CBeanPara();
        System.out.println("使用了 para1" + cBeanPara);
        return cBeanPara;
    }

    @Bean(value = "para2")
    @Scope(value = "prototype")
    public CBeanPara createPara2(){
        CBeanPara cBeanPara = new CBeanPara();
        System.out.println("使用了 para2" + cBeanPara);
        return cBeanPara;
    }
}

5-2、spring自身提供方便junit进行测试的注解

        
            org.springframework
            spring-context
            5.2.1.RELEASE
        
        
            org.springframework
            spring-test
            5.2.1.RELEASE
            test
        

起因:在单元测试的时候,如何省去实例化对象过程

//以下两行注解相当于自动将配置导入和示例化
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = ConfigClass.class)

在test文件夹下的测试类配置如下注解

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = ConfigClass.class)
public class SpringJunit {

    @Autowired
    CBean bean;

    @Autowired
    @Qualifier("para2")
    CBeanPara cBeanPara;

    @Test
    public void test() {
        System.out.println("测试" + bean);
    }
    
}

你可能感兴趣的:(Spring 初级入门)