spring -- 2、springIOC_spring ioc 获取ioc容器中的具体对象,需要强制类型转换-程序员宅基地

技术标签: spring  springIOC  springioc  后端  

目录

1、

1.2:

1.3: 解决在1和2中“用户服务”重复添加代码比较麻烦的问题(因为只允许开一个)

1.4、

2、IOC控制反转:(设计思想:通过中介)

2.1、跟上面的第三方相似

2.2、DI与IOC:

2.3、图

2.4、spring每个绿框都是对应不同模块:

3、

3.1、测试:

3.2、maven仓库的分类:

3.3、创建文件:

3.4、

3.4.1、获取属性:

3.4.2、通过构造器给对象赋值:

3.4.3、 对命名空间为bean的标签进行赋值,简化配置文件中属性声明的写法:

3.4.4、 为复杂类型进行赋值操作

3.4.5、 继承关系bean的配置(bean之间的继承关系)

3.4.6、 bean对象创建的依赖关系

3.4.7、 bean的作用域控制,是否是单例

3.4.8、 利用工厂模式创建bean对象

3.4.9、 继承FactoryBean(工厂豆)来创建对象

3.4.10、 bean对象的初始化和销毁方法

3.4.11、 配置bean对象初始化方法的前后处理方法


1、

普通创建项目方式:

java文件:UserDao(用户访问接口)

public interface UserDao {
    public void getUser();
}

java文件: UserDaoImpl(用户访问)

public class UserDaoImpl implements UserDao {
    @Override
    public void getUser() {
        System.out.println("获取用户");    }
}

java文件:UserService(用户服务接口)

public interface UserService {
    public void getUser();
}

java文件:UserServiceImpl(用户服务)

public class UserServiceImpl implements UserService {
============================= 1、 ===================================
//    private UserDao userDao = new UserDaoImpl(); //只能开一个
============================= 2、 ===================================
//    private UserDao userDao = new UserDaoMysqlImpl(); //只能开一个
============================= 3、 ===================================
    private UserDao userDao;
    public void setUserDao(UserDao userDao){
        this.userDao = userDao;
    }
=====================================================================
    @Override
    public void getUser() {
        userDao.getUser();
    }
}

java文件:MyText(测试)

public class MyTest {
    public static void main(String[] args) {
============================= 1、 ===================================
        UserServiceImpl userService = new UserServiceImpl();
        userService.getUser();
============================= 3、 ===================================
第三方:UserDaoMysqlImpl userDaoMysql = new UserDaoMysqlImpl();
        userService.setUserDao(userDaoMysql);
        userService.getUser();
============================= 4、 ===================================
        userService.getUser();
        System.out.println("--------------");
        UserDaoOracleImpl userDaoOracle = new UserDaoOracleImpl();
        userService.setUserDao(userDaoOracle);
        userService.getUser();
=====================================================================
    }
}

(四种获取方式)

都是:

1.2:

java文件:UserDaoMysqlImpl(用户访问Mysql)

public class UserDaoMysqlImpl implements UserDao {
    @Override
    public void getUser() {
        System.out.println("从mysql获取数据");
    }
}

1.3 解决在1和2中用户服务”重复添加代码比较麻烦的问题(因为只允许开一个)

1.4、

java文件:UserDaoOracleImpl(用户访问Oracle)

public class UserDaoOracleImpl implements UserDao {
    @Override
    public void getUser() {
        System.out.println("从oracle中获取数据");
    }
}

2IOC控制反转:(设计思想:通过中介)

2.1、跟上面的第三方相似

1、谁控制谁:在之前的编码过程中,都是需要什么对象自己去创建什么对象,有程序员自己来控制对象,而有了IOC容器之后,就会变成由IOC容器来控制对象,
2、控制什么:在实现过程中所需要的对象及需要依赖的对象
3、什么是反转:在没有IOC容器之前我们都是在对象中主动去创建依赖的对象,这是正转的,而有了IOC之后,依赖的对象直接由IOC容器创建后注入到对象中,由主动创建变成了被动接受,这是反转
4、哪些方面被反转:依赖的对象

2.2DI与IOC:

很多人把IOC和DI说成一个东西,笼统来说的话是没有问题的,但是本质上还是有所区别的,希望大家能够严谨一点,IOC和DI是从不同的角度描述的同一件事,IOC是从容器的角度描述,而DI是从应用程序的角度来描述,也可以这样说,IOC是设计思想,而DI是具体的实现方式

2.3、图

 解决方式→ 

无论是架构师还是程序员,在面临这样的场景的时候,都需要减少这些对象的耦合性:

       从上图中可以看到,当引入了第三方的容器之后,几个对象之间就没有了耦合关系,全部对象都交由容器来控制,这个容器就相当于粘合剂,将系统的对象粘合在一起发挥作用。

2.4spring每个绿框都是对应不同模块:

从下往上创建:

Core Container(IOC反转)

3、

3.1、测试:

导入包后,里面会多出一个选项

java文件:Person(个人)

private int id;
    private String name;
    private int age;
    private String gender;

    public Person() {
        System.out.println("person被创建");
    }
    public int getId() {return id;}
    public void setId(int id) {this.id = id;}

    public String getName() {return name;}
    public void setName(String name) {this.name = name;}

    public int getAge() {return age;}
    public void setAge(int age) {this.age = age;}

    public String getGender() {return gender;}
    public void setGender(String gender) {this.gender = gender;}

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }
}

xml文件:ioc

bean标签:表示要创建的bean对象
id:唯一标识,为了跟其他的bean标签区分
class:表示要创建的bean的完全限定名

property标签:给属性赋值使用
name:表示属性的名称
value:表示具体的属性值

<bean id="person" class="com.mashibing.bean.Person">
    <property name="id" value="1"></property>
    <property name="name" value="zhangsan"></property>
    <property name="age" value="20"></property>
    <property name="gender" value="男"></property>
 </bean>

java文件:MyText(测试)

ApplicationContext:表示IOC容器的入口,想要获取对象的话,必须要创建该类
该类有两个读取配置文件的实现类(相当于中介):
ClassPathXmlApplicationContext:表示从classpath中读取数据
FileSystemXmlApplicationContext:表示从当前文件系统读取数据

public class MyTest {
    public static void main(String[] args) {
        //Person person = new Person();
        //System.out.println(person);

        ApplicationContext context = new ClassPathXmlApplicationContext("ioc.xml");
//获取具体的bean实例对象,需要进行强制类型转换
        //Person person = (Person) context.getBean("person");

//获取对象的时候不需要强制类型转换
        Person person = context.getBean("person", Person.class);
        System.out.println(person);

    }
}

容器中的person对象是什么时候创建的?
容器中的对象在容器创建完成之前就已经把对象创建好了

3.2maven仓库的分类:

       本地仓库:本地仓库就是开发者本地已经下载下来的或者自己打包所有jar包的依赖仓库,本地仓库路径配置在maven对应的conf/settings.xml配置文件。

       私有仓库:私有仓库可以理解为自己公司的仓库,也叫Nexus私服

       中央仓库:中央仓库即maven默认下载的仓库地址,是maven维护的

说明:私有仓库需要每天维护,将外面与内部相关的信息、地址不断修改

 

 

maven常用命令:

  • clean清理编译后的目录
  • compile编译,只编译main目录,不编译test中的代码
  • test-compile编译test目录下的代码
  • test运行test中的代码
  • package打包,将项目打包成jar包或者war
  • install发布项目到本地仓库用在打jar包上,打成的jar包可以被其他项目使用
  • deploy打包后将其安装到pom文件中配置的远程仓库
  • site生成站点目录

3.3创建文件:

打开:

3.4

3.4.1、获取属性:

java文件:Person(个人)

private int id;
    private String name;
    private int age;
    private String gender;
========================= 利用的是构造器 ============================
    public Person() {
        System.out.println("person被创建");
    }
=====================================================================
    public int getId() {return id;}
    public void setId(int id) {this.id = id;}

    public String getName() {return name;}
    public void setName(String name) {this.name = name;}

    public int getAge() {return age;}
    public void setAge(int age) {this.age = age;}

    public String getGender() {return gender;}
    public void setGender(String gender) {this.gender = gender;}

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }
}

xml文件:ioc

<bean id="parent" class="com.mashibing.bean.Person" abstract="false"> 
        <property name="id" value="1"></property>
        <property name="name" value="zhangsan"></property>
        <property name="age" value="20"></property>
        <property name="gender" value="男"></property>
    </bean>

java文件:Mytest(测试)

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("ioc.xml");
        /*根据bean标签的id来获取对象*/
     Person person = context.getBean("person", Person.class);
     System.out.println(person);

========================= 2、(多例模式)============================
     //Person person2 = context.getBean("person",Person.class);
     //System.out.println(person == person2);  
=====================================================================

//上面是通过id:person获取属性
//下面是直接获取整个类的属性(如果存在同名的id会报错)
     //Person bean = context.getBean(Person.class);
     //System.out.println(bean);

细节点:

       1对象在Spring容器创建完成的时候就已经创建完成,不是需要用的时候才创建,这种情况值满足单例模式 (容器中创建)

       2单例与多例

       3给属性赋值的时候是通过容器中的set方法实现的

        4对象的属性是由set/get方法决定的,而不是定义的成员属性

总结:获取属性的三种方式:

1、(之前已经讲了)

2ApplicationContext通过id:person获取属性

3、ApplicationContext,通过类整个类获取属性

3.4.2通过构造器给对象赋值:

java文件:Person(个人)

添加构造器

public Person(int id, String name, Integer age, String gender) {
    this.id = id;
    this.name = name;
    this.age = age;
    this.gender = gender;
}

xml文件:ioc

方式一:

<bean id="person2" class="com.mashibing.bean.Person">
    <constructor-arg name="id" value="2"></constructor-arg>
    <constructor-arg name="name" value="lisi"></constructor-arg>
    <constructor-arg name="age" value="22"></constructor-arg>
    <constructor-arg name="gender" value="男"></constructor-arg>
</bean>

方式二:(前面讲了)

方式三:

(位置交换)(结果的位置也交换)

java文件:Mytest(测试)

xml文件:ioc(但是要注意里面的顺序,如果顺序不一致的话,可以用index索引到那个值)

<bean id="person3" class="com.mashibing.bean.Person">
    <constructor-arg  value="2"></constructor-arg>
    <constructor-arg  value="男" index="3"></constructor-arg>
    <constructor-arg  value="22"></constructor-arg>
    <constructor-arg  value="lisi" index="1"></constructor-arg>
</bean>

name:表示参数列表的名称
value:表示实际的具体值
type:表示值的类型
index:表示值的下标,从0开始

==========================================

java文件:Person(个人)创建有参构造方法:

java文件:Mytest(测试)

xml文件:ioc

<bean id="person4" class="com.mashibing.bean.Person">
    <constructor-arg  value="4"></constructor-arg>
    <constructor-arg  value="wangwu"></constructor-arg>
    <constructor-arg  value="22" type="java.lang.Integer">
</constructor-arg>
</bean>

先执行下面构造函数,执行是有顺序的:

//构造方法交换位置:

解决办法:(一般用在id后面)

 

总结:

在日常工作中,一般都是用name,value的方式,很少有人去使用index或者type的方式,但是要注意各种情况出现的问题

3.4.3命名空间为bean的标签进行赋值,简化配置文件中属性声明的写法:

xml文件:ioc

1、导入命名空间:

2、添加配置:

使用p命名空间来给属性赋值:

<bean id="person5" class="com.mashibing.bean.Person" 
p:id="5" 
p:name="wangwu"
p:age="25" 
p:gender="女">
</bean>

java文件:Mytest(测试)

Person person5 = context.getBean("person5", Person.class);
System.out.println(person5);

3.4.4 为复杂类型进行赋值操作

java文件:Person(个人)

public class Person {
    private int id;
    private String name;
    private Integer age;
    private String gender;    
=========================== 从这里开始 ==============================
    private String[] hobbies; 1、 数组
    private Address address;  2、 引用

    private List<Address> lists; 3、 获取对象的值
    private Set<String> sets;    4、 给数组赋值
    private Map<String,Object> maps; 5、 赋值
    private Properties properties;   6、 赋值

    //public Person() {System.out.println("person被创建");}
    public Person(int id, String name, Integer age, String gender) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
    public Person(int id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
        System.out.println("age......");
    }
    public Person(int id, String name, String gender) {
        this.id = id;
        this.name = name;
        this.gender = gender;
        System.out.println("gender.....");
    }
    public int getId() {return id;}
    public void setId(int id) {this.id = id;}

    public String getName() {return name;}
    public void setName(String name) {this.name = name;}

    public Integer getAge() {return age;}
    public void setAge(Integer age) {this.age = age;}

    public String getGender() {return gender;}
    public void setGender(String gender) {this.gender = gender;}

    public String[] getHobbies() {return hobbies;}
    public void setHobbies(String[] hobbies){this.hobbies = hobbies;}

    public Address getAddress() {return address;}
    public void setAddress(Address address) {this.address = address;}

    public List<Address> getLists() {return lists;}
    public void setLists(List<Address> lists) {this.lists = lists;}

    public Set<String> getSets() {return sets;}
    public void setSets(Set<String> sets) {this.sets = sets;}

    public Map<String, Object> getMaps() {return maps;}
    public void setMaps(Map<String, Object> maps) {this.maps = maps;}

    public Properties getProperties() {return properties;}
    public void setProperties(Properties properties) {
        this.properties = properties;
    }
    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                ", hobbies=" + Arrays.toString(hobbies) +
                ", address=" + address +
                ", lists=" + lists +
                ", sets=" + sets +
                ", maps=" + maps +
                ", properties=" + properties +
                '}';
    }
}

java文件:Address(住址)

public class Address {
    private String province; //省
    private String city; //市
    private String town; //城

    public Address() {System.out.println("address被创建");}
    public String getProvince() {return province;}
    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {return city;}
    public void setCity(String city) {this.city = city;}

    public String getTown() {return town;}
    public void setTown(String town) {this.town = town;}
    @Override
    public String toString() {
        return "Address{" +
                "province='" + province + '\'' +
                ", city='" + city + '\'' +
                ", town='" + town + '\'' +
                '}';
    }
}

java文件:Mytest(测试)

    Person person6 = context.getBean("person6", Person.class);
    System.out.println(person6);

xml文件:ioc

<bean id="person6" class="com.mashibing.bean.Person">
        <property name="id" value="6"></property>
        <property name="name" value="zhangsan6"></property>
        <property name="age" value="26"></property>
        <property name="gender" value="男6"></property>
=============================== 1、 =================================

//给数组赋值

方式一:<property name="hobbies" value="book,girl,movie"></property>
方式二:<property name="hobbies">
            <array>
                <value>book</value>
                <value>girl</value>
                <value>movie</value>
            </array>
        </property>
=============================== 2、 =================================
//给引用类型赋值,可以使用ref引入外部bean
//address(住址类),ref(引用)
        <bean id="address" class="com.mashibing.bean.Address">
            <property name="address" ref="address"></property></bean>
 
            <property name="lists" value="1,2,3"></property>
 
        </bean>
        <bean id="address" class="com.mashibing.bean.Address">
            <property name="province" value="河北省"></property>
            <property name="city" value="邯郸"></property>
            <property name="town" value="武安"></property>
        </bean>
=============================== 3、 =================================
        <property name="lists">
           <list>
//使用内部bean,无法从IOC容器中直接获取对象的值(<bean后面不能加id="address2")
              <bean class="com.mashibing.bean.Address">
                   <property name="province" value="北京"></property>
              </bean>
              <bean class="com.mashibing.bean.Address">
                   <property name="province" value="上海"></property>
              </bean>

=====================================================================
//使用外部bean,可以随意从IOC容器获取对象的值(随意)
              <ref bean="address"></ref>

           </list>
        </property>
=============================== 4、 =================================
//给set属性赋值
        <property name="sets">
            <set>
                <value>zhangsan</value>
                <value>zhangsan</value>
                <value>lisi</value>
            </set>
        </property>

=============================== 5、 =================================
//给map赋值
        <property name="maps">
            <map>
                <entry key="a" value="aaa"></entry>
//引用:--------<entry key="address" value-ref="address"></entry>
                <entry key="address2">
//在自己内部创建对象<bean class="com.mashibing.bean.Address">
                        <property name="province" value="广东省">
</property>
                    </bean>
                </entry>

               <entry>              
                    <key>
                        <value>heihei</value>
                    </key>
                    <value>haha</value>
                </entry>

                <entry key="list">                
                    <list>
                        <value>11</value>
                        <value>22</value>
                    </list>
                </entry>
            </map>
        </property>

也可用利用文档方式:

3.4.5 继承关系bean的配置(bean之间的继承关系)

如果想实现Java文件的抽象类,不需要将当前bean实例化的话,可以使用abstract属性

xml文件:ioc

//可以使用abstract标签定义抽象bean,但无法进行实例化
<bean id="parent" class="com.mashibing.bean.Person" abstract="false">
    <property name="id" value="1"></property>
    <property name="name" value="zhangsan"></property>
    <property name="age" value="20"></property>
    <property name="gender" value="男"></property>
</bean>

//可以通过parent属性来获取父bean中的某些属性值
<bean id="son" class="com.mashibing.bean.Person" parent="parent">
    <property name="name" value="haha"></property>
</bean>

java文件:Mytest(测试)

    Person son = context.getBean("son", Person.class);
    System.out.println(son);

ico.xml中添加:parent="parent"

java文件:Mytest(测试)

    Person parent = context.getBean("parent", Person.class);
    System.out.println(parent);

ico.xml中添加:abstract="false"teun是用于实例化)

3.4.6 bean对象创建的依赖关系

添加:

xml文件:ioc

如果需要干扰创建的顺序,可以使用depends-on属性

    <bean id="address" class="com.mashibing.bean.Address" depends-on
="person"></bean>
    <bean id="person" class="com.mashibing.bean.Person"></bean>
//

(ioc.xml代码的顺序与该顺序是相关的)

3.4.7 bean的作用域控制,是否是单例

bean的作用域:singleton、prototype、request、session

默认情况下是单例

singleton(单例):默认的单例对象,IOC容器启动完成之前就已经创建好对象,获取的都是同一个对象

prototype(多例):多实例

        IOC容器启动的时候不会创建多实例bean,只有在获取对象的时候才会创建该对象,每次创建都是一个新的对象

另外两个作用域:request、session(在spring5.x的版本就去掉了)

request(请求)每次发送请求都会有一个新的对象

session:(会话)每一个会话都会有一个新的对象(默认是30分钟,不做任何操作会消失)

 

xml文件:ioc

//设置bean对象的作用域
    <bean id="person2" class="com.mashibing.bean.Person" scope(范围)=
"singleton"></bean>

java文件:Mytest(测试)

    Person parent2 = context.getBean("parent2", Person.class);
Person parent3 = context.getBean("parent3", Person.class);
    System.out.println(parent2 == parent3);

换成:scope(范围)="prototype"时,为

(上面java代码需要用到,person就立即创建)

singleton(单例):每次在创建IOC容器完成之前此对象已经创建完成

prototype(多例):每次是在需要用到此对象的时候才会创建

3.4.8 利用工厂模式创建bean对象

在利用工厂模式创建bean实例的时候有两种方式:

       静态工厂:工厂本身不需要创建对象,但是可以通过静态方法调用

对象 = 工厂类.静态工厂方法名();

 

       实例工厂:工厂本身需要创建对象

工厂类 工厂对象 = new 工厂类;

工厂对象.get对象名();

java文件:PersonStaticFactory(静态工厂)

public class PersonStaticFactory {
    public static Person getInstance(String name){
        Person person = new Person();
        person.setId(1);
        person.setName(name);
        person.setAge(11);
        return person;
    }
}

java文件:PersonInstanceFactory(实例工厂)

public class PersonInstanceFactory {
    public Person getInstance(String name){
        Person person = new Person();
        person.setId(2);
        person.setName(name);
        person.setAge(22);
        return person;
    }
}

xml文件:ioc

============================ 静态工厂 ===============================
    <bean id="person2" class="com.mashibing.bean.Person" scope=
"singleton">
</bean>

//利用工厂方法创建bean
//静态工厂:类名.静态方法()
//factory-bean:工厂类的实例
//factory-method:工厂实例的方法

    <bean id="person" class=
"com.mashibing.factory.PersonStaticFactory" factory-method=
"getInstance"> //getInstance工厂方法
        <constructor-arg value="zhangsan"></constructor-arg>
    </bean>

============================ 实例工厂 ===============================
//实例工厂:先创建工厂实例,然后调用工厂实例的方法

    <bean id="instanceFactory(实例工厂)" class=
"com.mashibing.factory.PersonInstanceFactory"></bean>
    <bean id="person2" class="com.mashibing.bean.Person" 
factory-bean="instanceFactory(实例工厂)" factory-method="getInstance"> //getInstance工厂方法
        <constructor-arg value="lisi"></constructor-arg>
    </bean>

java文件:MyText(测试)

============================ 静态工厂 ===============================
Person person = context.getBean("person", Person.class);
    System.out.println(person);
============================ 实例工厂 ===============================
Person person2 = context.getBean("person2", Person.class);
    System.out.println(person);

3.4.9 继承FactoryBean(工厂豆)来创建对象

Spring都会将其作为一个工厂,但是在ioc容器启动的时候不会创建实例,只有在使用的时候才会创建对象(相当于prototype多例)

 

java文件:MyFactoryBean(工厂豆)

public class MyFactoryBean implements FactoryBean<Person> {
//返回获取的bean
    public Person getObject() throws Exception {
        Person person = new Person();
        person.setId(3);
        person.setName("王五");
        return person;
    }
//获取返回bean的类型
    public Class<?> getObjectType() {
        return Person.class;
    }
//判断当前bean是否是单例的
    public boolean isSingleton() {
        return true;
    }
}

xml文件:ioc

    <bean id="myFactoryBean" class=
"com.mashibing.factory.MyFactoryBean">
    </bean>

java文件:MyText(测试)

Person myFactoryBean = context.getBean("myFactoryBean",Person.class);
System.out.println(myFactoryBean);

3.4.10 bean对象的初始化和销毁方法

java文件:Person(个人)

public void init(){
·
·
·
//编写N行逻辑代码完成初始化功能
    System.out.println("person对象初始化完成");
}
public void destory(){
    System.out.println("person对象被销毁");
}

xml文件:ioc

spring容器在创建对象的时候可以指定具体的初始化和销毁方法:
init-method:在对象创建完成之后会调用初始化方法
destory-method:在容器关闭的时候会调用销毁方法

<bean id="person" class="com.mashibing.bean.Person"
init-method="init(初始化)" destroy-method="destory(销毁)" scope="singleton(单例)"> 

初始化和销毁的方法跟scope属性也是相关联的:
如果是singleton(单例)的话,初始化和销毁的方法都显示
如果是prototype(多例)的话,初始化方法会调用,但是销毁的方法不会显示

java文件:MyText(测试)

Person person = context.getBean("person", Person.class);
    System.out.println(person);
//一般关闭对象用:context.close();

因为context对应ioc文件

//但是这里关闭用的是另一种:

  ((ClassPathXmlApplicationContext)context).close();  

3.4.11 配置bean对象初始化方法的前后处理方法

spring中包含一个BeanPostProcessor的接口,可以在bean的初始化方法的前后调用该方法,如果配置了初始化方法的前置和后置处理器,无论是否包含初始化方法,都会进行调用

java文件:MyBeanPostProcessor(豆布置处理器)

public class MyBeanPostProcessor implements BeanPostProcessor {
    /**
     * 在每一个对象的初始化方法前面执行
     * @param bean:表示创建的具体对象
     * @param beanName:表示bean的id属性
     * @return
     * @throws BeansException
     */
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {

System.out.println("postProcessBeforeInitialization:"+beanName);
        return bean;
    }
    /**
     * 在每一个对象的初始化方法后面执行
     * @param bean
     * @param beanName
     * @return
     * @throws BeansException
     */
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

System.out.println("postProcessAfterInitialization:"+beanName);
     return bean;
    }
}

xml文件:ioc

<bean id="myBeanPostProcessor" class="com.mashibing.bean.MyBeanPostProcessor">
</bean>

<bean id="aAddress" class="com.mashibing.bean.Address"></bean>

 


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45042569/article/details/107227088

智能推荐

java double转String,去掉科学计数法_数值类型转成字符串后,不要用科学计数法-程序员宅基地

文章浏览阅读1.8k次。在数值型double转String格式时,如果同时遇到数值较大的double和小数位较多的double处理方法:double a = 123456789.10001;double b = 1.987654321;System.out.println("a: " + a);System.out.println("b: " + b);java.text.NumberFormat NF = java.text.NumberFormat.getInstance();//设置数值的小数部分所允许的最大._数值类型转成字符串后,不要用科学计数法

Fiddler抓包—手机app抓包_fiddler 移动端 app抓包-程序员宅基地

文章浏览阅读1.3k次。Fiddler抓包工作原理正常情况下,手机app是直接向服务器请求数据的,如果通过Fiddler抓包那么需要通过Fiddler,再向服务器请求数据。当app数据传到Fiddler,那么可以将请求的数据进行修改。比如app请求"123456",那么Fiddler可以将这一串数字改成"1",再发给服务器。此时服务器接收到的数据就是"1"。服务器返回数据到app和请求数据是一样的道理。Fid..._fiddler 移动端 app抓包

【200326】R语言read.table的用法以及报错line 6 did not have 15 elements 读取的项目数必需是列数的倍数-程序员宅基地

文章浏览阅读1.9w次,点赞10次,收藏32次。以2020美赛C题数据为例data <- read.table("D:\\mm\\Problem_C_Data\\hair_dryer.tsv" ,header = T, sep ="\t",dec = ".",quote="",comment.char = "",na.strings = c("NA"),fill=T)因为是tsv:Tab-separated values即制表符..._读取的项目数必需是列数的倍数

在使用Notepad++ WinSCP SFTP遇到的连接失败问题分析_如何使用notepad连接服务器一直失败-程序员宅基地

文章浏览阅读5.5k次。终于解决了一个困扰我几次的问题。在此经验分享一下,希望能帮到遇到同样问题的朋友。问题的起因是想使用Notepad++连接SFTP服务器,无法成功建立连接,总是停在通过验证后。Notepad++中的NppFTP插件一直显示”NppFTP - connecting“,无法取消,也不能进行其他操作。[NppFTP] Everything initializedConnecting_如何使用notepad连接服务器一直失败

python生成可视化操作界面,python怎么做可视化界面-程序员宅基地

文章浏览阅读969次,点赞10次,收藏27次。Python实战100例小伙伴们在学习Python的过程中,有时候不知道怎么学,从哪里开始学。掌握了一些基本的知识或者做了一些案例后,不知道下一步怎么走,不知道如何去学习更加高深的知识。那么对于这些大兄弟们,我准备了大量的免费视频教程,PDF电子书籍,以及源代码!下方名片自取即可,我都放在这里了。今天的分享就到这里结束辽~大家下次再见!

Centos服务器安装宝塔_宝塔安装 centos-程序员宅基地

文章浏览阅读326次,点赞5次,收藏4次。之后就可以连接远程mysql了,注意,以上是针对mysql8的解决方案,mysql5及以下可能不同。mysql密码修改完成,注意mysql5和8的修改方式会有不同,这里修改的是mysql8。宝塔安装完以后可以通过图形化界面安装mysql8,0,然后进行msyql重置密码。再次修改my.cnf文件,去掉添加的skip-grant-tables。默认yes即可,出现下面界面时即为安装成功。服务器端需要修改安全组,确保放行3306端口。登录mysql,此时不需要密码了。然后按esc输入:wq保存退出。_宝塔安装 centos

随便推点

解决ToolBox升级IDEA后导致之前配置的插件消失问题(附:IDEA2020版本前后配置文件地址)【修理篇】_toolbox 下载的ide没有copy之前的插件进来-程序员宅基地

文章浏览阅读2.5k次。【修理篇】ToolBox升级IDEA后之前配置的插件消失问题(附:IDEA2020版本前后配置文件地址)    在IDEA的插件配置地址都是可配置的,通过修改idea.properties可指定插件和logs的地址等这个配置文件地址在IDEA2020.1版本后出现了一些变化。如下:2020.1版本之前:配置文件地址在IDEA安装目录的bin目录下。2020.1版本之后:在此版本之后有两种方法。1.从C盘\User\Administrator里开始找AppData\Roaming\JetBra_toolbox 下载的ide没有copy之前的插件进来

File Monitor on WinRT-程序员宅基地

文章浏览阅读48次。http://lunarfrog.com/blog/filesystem-change-notifications Use CreateFileQueryWithOptions to add file monitor(win32 use file watcher).* By default it FolderDepth is Shallow(root folder only), D..._file monitor on window server

vue2 + electron 用超简单方法搭建前端桌面应用_vue 2.0 安装electron-程序员宅基地

文章浏览阅读564次。vue2 + electron 非常简单的搭建方法_vue 2.0 安装electron

【初学者】SVG图片加载失败,求解_解析失败 (带有png备选的svg(mathml可通过浏览器插件启用)-程序员宅基地

文章浏览阅读2.6k次。最近在做期末作业,用Jekyll架站,前几天添加的svg图片还能加载,今天就不能了在hbuilder上是这样写的,前几天添加的svg图片还能加载,今天就不能了。用chrome检查是这样的请问应该怎么解决?..._解析失败 (带有png备选的svg(mathml可通过浏览器插件启用)

html2canvas (踩坑) 网络图片显示不出来&生成图片只有一半或者空白&文字显示不出来问题处理_htm2canvas 图片只有左边一半-程序员宅基地

文章浏览阅读1.8w次,点赞7次,收藏13次。这里只提供解决思路,代码就不粘贴出来了图片显示不出来就像大多数人说的一样,HTML中的图片产生了跨域,可以将网络图片转为base64后修改img 的src属性值,添加图片允许跨域的属性。调用html2canvas的API时,将跨域参数设置为true,允许跨域。图片生成显示不全,只有半截或者空白在有滚动的页面,产生了滚动条后,生成的图片可能会只有一半或者空白。答案只有一个,那就是要把html2canvas的配置项参数中,scrollx,scrolly都设置为0,问题就解决了。     o゚*。o恭_htm2canvas 图片只有左边一半

PingOS服务器系统常见问题总结_exec_pull-程序员宅基地

文章浏览阅读2.4k次。转载请注明出处:https://blog.csdn.net/impingo我的开源项目地址:https://github.com/pingostack/pingos开源项目:https://pingos.io目录1. 如何支持H265编码?2. 如何降低直播延时?2.1 优化推流端2.2 优化PingOS服务器配置2.3 优化播放器端3. 如何降低HLS直播延时?4. 如何支持拉取rtsp源?QQ交流群:697773082本篇内容记录大家问的比较多的问题,持续更新…1. 如何支持H265编码?_exec_pull