栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

笔记------Spring框架

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

笔记------Spring框架

Spring框架:是一个轻量级的java开发框架,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题,是一个IOC(控制反转)和APO(面向切面)的容器框架。

 

IOC:Inversion of Control,控制反转,简单的来说对象是由Spring来创建、管理。例如:一个A类和一个B类,以前A类中用B类,直接B b = new B();,Spring的话,new这个动作就交给了Spring,Spring(new B());此时要用B类的话,就需要依赖Spring的注入,B b = new Spring.getBean("b");此时的控制权就不再是A类了 ,需要从Spring里面去拿,控制权就反转了。

导入jar包,配置xml(jar包可在rep.spring.io中去下载)

运行结果:

SpringIoC的xml配置使用

maven结构:

@Test
    public void test01(){
        //加载Spring容器
        //ApplicationContext   spring的顶层核心接口
        //ClassPathXmlApplicationContext:根据项目路径的xml配置来实例化spring容器
        //FileSystemXmlApplicationContext   根据磁盘路径的xml配置来实例化spring容器
        //AnnotationConfigApplicationContext   根据javaconfig来配置实例化spring容器
        //在容器实例化的时候   就会加载所有的bean
        ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");

        //获取bean
        //1.通过类来获取bean  ioc.getBean(User.class);
        //2.通过bean的名字或id来获取bean   (User) ioc.getBean("user");
        //3.通过名字+类型来获取bean   ioc.getBean("user", User.class);
        User  bean = ioc.getBean("user", User.class);
        System.out.println(bean);
    }

IOC的xml配置使用(即上面的spring-ioc.xml的配置使用)

基本使用










        
        







        
        







        


        
        




        
            
                动漫
                小说
            
        




        
            
                
                
            
        


高级使用




















 byType 根据类型自动匹配注入 当出现多个类型或者匹配不到类型则会报错 autowire="byType"
 byName 根据set方法的名字自动匹配注入  autowire="byName"
 constructor 根据构造器去自动匹配注入  优先根据参数名字去匹配,如果参数名字没有匹配到,则根据参数类型去匹配,类型假如出现多个会注入失败但是不会报错; 
并且会根据构造函数的参数进行完整的匹配注入  例如:构造函数的参数public Person(Wife wife,User user),ioc容器里面要同时有wife和user,即为:

        


当根据类型匹配到多个,可以使用(任选一种方法):
    1.设置某个bean为主要bean   primary="true"
    2. 设置不需要自动注入的bean  autowire-candidate="false"  忽略自动注入 -->


        


        








        
        
        
        






        
        
        
        
        
        
        
        
        
        


        

上面所用到主要的方法(Person.class中)

public class Person implements InitializingBean, DisposableBean{
//省略

//使用静态工厂方法实例化Bean
public static Person createPersonFactory(){
        Child child = new Child();
        child.setName("儿子");
        return child;
    }


//生命周期回调

//实例化Bean
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("实例化Bean1");
    }

//销毁Bean
    @Override
    public void destroy() throws Exception {
        System.out.println("销毁Bean1");
    }



//实例化Bean
    public void initByConfig() throws Exception {
        System.out.println("实例化Bean2");
    }

//销毁Bean
    public void destroyByConfig() throws Exception {
        System.out.println("销毁Bean2");
    }
}

上面所用到主要的方法(PersonFactory.class中)

//使用实例工厂方法实例化Bean 
public Person createPersonFactoryMethod(){
        Child child = new Child();
        child.setName("女儿");
        return child;
    }


//SpEL的使用 调用静态方法
public static Date getNowDate(){
        return new Date();
    }

pom.xml



    4.0.0

    cn.yuxinyi
    Spring_maven
    1.0-SNAPSHOT


    
        8
        8
    

    
        
        
            org.springframework
            spring-context
            5.0.2.RELEASE
            compile
        
        
            junit
            junit
            4.13
            test
        

        
            com.alibaba
            druid
            1.1.21
        
        
            mysql
            mysql-connector-java
            5.1.8
        
    

db.properties

mysql.username = root
mysql.password = 123456
mysql.url = jdbc:mysql://localhost:3306/test
mysql.driverClassName = com.mysql.jdbc.Driver
SpringIoC的注解使用

标记在控制层:@Controller

标记在业务逻辑层:@Service

标记在数据访问层:@Repository

标记在非三层的普通的类上:@Component

配置文件 spring-ioc.xml

需要在配置文件中添加该语句,来扫描对应的包:




    
使用@Value设置依赖注入的值

1. 直接取值  例如:@Value("小鱼")

2. 也可以使用#{获取外部属性资源文件的值}  例如:@Value("${mysql.username}")    此时需要在配置文件里面加入从而引用外部资源文件

3. 也可以使用${SpEL表达式}  例如:@Value("#{person.getSex()}")

 加载顺序 例如在Person中添加@DependsOn("user")

 懒加载 只有在使用的时候才会加载 例如在Person中添加@Lazy

 作用域 例如在Person中添加@Scope("prototype"):多例,默认是单例

实现自动注入@Autowired

默认优先根据类型进行匹配;如果遇到多个类型,则根据属性的名字进行匹配;如果名字也没有匹配到,则会报错

 @Autowired
 UserService userService; //属性的名字

其解决方法:

        1.修改属性的名字对应bean的名字  例如:修改为UserService userServiceImpl

        2.修改bean的名字对应属性的名字  例如:在业务逻辑层添加@Service("userService")

        3.可以通过@Qualifier来设置其属性的名字  例如:修改为@Qualifier("userServiceImpl")

        4.可以通过@Primary设置其中一个bean为主要的自动注入的bean  例如:在一个userServiceImpl.java中添加@Primary设置为主要的

        5.使用泛型作为自动注入限定符  

关于@Autowired:

        1.可以单独写,如上图

        2.可以写在方法上

@Autowired
public void CreateUserService(UserService userService){
    this.userService = userService;
}

        3.可以写在构造器上

@Autowired
public UserController(UserService userService){
    this.userService = userService;
}

        除了@Autowired,@Resource也可以实现自动注入,两者的区别:

                1.@Autowired依赖spring,@Resource依赖jdk

                2.@Autowired优先根据参数的类型进行匹配,@Resource优先根据参数的名字进行匹配

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/978596.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号