2.2.1、案例
-
创建 Maven Moudle
-
引入依赖
<dependencies> <!-- 基于Maven依赖传递性,导入spring-context依赖即可导入当前所需的所有jar包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.28</version> </dependency> <!-- junit测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>
3. 创建类Student
4. 创建Spring的配置文件 applicationContext.xml
5. 在Spring的配置文件中配置bean
6. 创建测试类测试
注意:在Spring中获取bean,默认是通过反射调用无参构造方法,所以类中必须要提供一个无参构造方法
-
结果
2.2.2、获取Bean的三种方式
-
根据bean的id获取
-
根据bean的类型获取
要求在配置文件中只能有一个该类匹配的bean,若有多个该类的Bean,会报错:NoUniqueBeanDefinitionException: No qualifying bean of type 'com.my.pojo.Student' available: expected single matching bean but found 2: studentOne,studentTwo
-
根据bean的id和类型获取
Spring的bean默认是单例的,若想多例,在bean标签中添加 scope="prototype"
-
如果组件类实现了接口,可以根据接口类型获取bean
注意:bean得是唯一的
根据类型来获取bean时,在满足bean唯一性的前提下,只要:对象 instanceOf 类 的返回结果是true就可以认定为和类型匹配,能过获取到。
通过bean的的类型、bean所继承的类的类型,bean所实现的接口的类型都可以获取bean
2.2.3、依赖注入
为类中的属性赋值的过程就为依赖注入。
-
setter注入
<bean id="studentOne" class="com.my.pojo.Student"> <!-- property:通过成员变量的set方法赋值 name:设置需要赋值的属性名(和类的set方法有关) value:设置为属性所赋的值 --> <property name="stuid" value="123456"></property> <property name="sname" value="zhangsan"></property> <property name="score" value="123"></property> </bean>
-
构造器注入
<bean id="studentTwo" class="com.my.pojo.Student"> <!-- 与 public Student(String stuid, String sname, int score)构造方法相对应 可以通过name来指定属性匹配指定的构造器 --> <constructor-arg value="123456"></constructor-arg> <constructor-arg value="zhangsan"></constructor-arg> <constructor-arg value="123" name="score"></constructor-arg> </bean>
-
特殊值处理
<bean id="studentFour" class="com.my.pojo.Student"> <!-- 在value中的值会被当做字面量,如果value=null,这该null为"null" 注意:在xml中和html一样,一些特殊字符要进行处理 比如: >:< <:> --> <property name="stuid" value="1003"></property> <property name="sname"> <null></null> </property> <property name="score" value="1003"></property> </bean>
-
为类属性赋值
-
引用外部bean
<!-- 班级bean--> <bean id="clsOne" class="com.my.pojo.Cls"> <property name="cid" value="111"></property> <property name="cname" value="如此这班"></property> </bean> <bean id="studentFive" class="com.my.pojo.Student"> <property name="stuid" value="123456"></property> <property name="sname" value="zhangsan"></property> <property name="score" value="123"></property> <!-- ref:引用,其中的值为bean的id --> <property name="cls" ref="clsOne"></property> </bean>
-
级联方式
<bean id="studentSix" class="com.my.pojo.Student"> <property name="stuid" value="123456"></property> <property name="sname" value="zhangsan"></property> <property name="score" value="123"></property> <property name="cls" > <!-- 内部bean,只能在该IOC容器内使用,不能直接通过IOC容器获取 --> <bean id="clsInner" class="com.my.pojo.Cls"> <property name="cid" value="111"></property> <property name="cname" value="如此这班"></property> </bean> </property> </bean>
-
为数组属性赋值
<bean id="studentOne" class="com.my.pojo.Student"> <property name="stuid" value="123456"></property> <property name="sname" value="zhangsan"></property> <property name="score" value="123"></property> <property name="hobby"> <array> <!-- value:为字面量属性赋值 ref:为类类型的属性赋值 --> <value>吃饭</value> <value>睡觉</value> <value>打豆豆</value> </array> </property> </bean>
-
为List集合类型赋值
<bean id="clsTwo" class="com.my.pojo.Cls"> <property name="cid" value="111"></property> <property name="cname" value="如此这班"></property> <property name="students"> <list> <!-- value:为字面量属性赋值 ref:为类类型的属性赋值 --> <ref id="studentOne"></ref> <ref id="studentTwo"></ref> </list> </property> </bean>
-
为map集合赋值
<bean id="studentOne" class="com.my.pojo.Student"> <property name="stuid" value="123456"></property> <property name="sname" value="zhangsan"></property> <property name="score" value="123"></property> <property name="teacherMap"> <!-- key:字面量作为键 key-ref:类类型作为键 value:字面量作为值 value-ref:类类型作为值 --> <map key="张三" value="李老师"></map> </property> </bean>
-
Spring管理数据源
①加入依赖
<!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.16</version> </dependency> <!-- druid数据源 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.31</version> </dependency>
②创建外部配置文件
<!-- 引入jdbc.properties,之后可以通过${key}的方式访问value --> <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/test?serverTimeZone=UTC"></property> <property name="username" value="root"></property> <property name="password" value="root"></property> <!-- 在此配置最大连接数等等 --> </bean>
③测试
@Test public void testDataSource() throws SQLEXception { ApplicationContext ioc = new ClassPathXMLApplicationContext("applicationContext.xml"); DruidDataSource dataSource = ioc.getBean(DruidDataSource.class); System.out.println(dataSource.getConnection); }
④结果