1、set自动注入
bean有个属性 autowire autowire”byType”
自己去找对应的注入。也就是把原来的
<bean id="s1" class="bean.Student">
<!-- 利用set注入 -->
<property name="c" ref="p1" ></property>
<property name="p" ref="p2"></property>
</bean>
改成如下: 用autowire属性代替
<bean id="s2" class="bean.Student" autowire="byType">
</bean>
Student s2 = ac.getBean("s2",Student.class);
s2.show();
就会去上面找,对应的属性值传入。
但是要注意!有且只有一个。不然要报错。
也就是靠这个类型的,但是多个的话Spring就不知道传哪个了。
还有属性值byName就是按id是对应的
2、各种类型信息的注入配置格式
a.注入字符串,数值单个数值
<property name=” ” value=””>
因为从xml读出来的都是字符串。如果赋值的是int类型。Spring会帮助我们自动转换成int类型。但是不能转换的就不行了。比如age在xml中写的是abc就不行了。会报错。同样日期类型输入的不是Date的就会报错。要把配置的字符串转成date。如果一定要配置2016-12-19 那么就自己在set方法中设置我们给其转换。
b.注入bean对象
c.注入集合list,set,map,properties
注入list:
<property name=”list1”>
<list>
<value>tom</value>
<value>jack</value>
</list>
</property>
这个就会帮你创建list,里面的值是tom,jack 然后注入给llist1
如果想传入空值 null
就写
<property name=”name”> <null/> </property>
那么类中创建出来后name的值就是null了。没有写value属性写了null标签。
list中注入bean
<ref bean=”id”>
set类似
Map:
<map>
<entry key=”1001” value=”java”>
<entry key=”1002” value=”python”>
</map>
Properties注入 这个类型继承了HashTable
常用于一些连接数据库的信息
注入:
<property name=”db”>
<props>
<prop key=”username”>root</prop>
<prop key=”password”>root</prop>
<prop key=”driver”>com.mysql.jdbc.Driver</prop>
</props>
</property>
然后:
Set<Object> keys = db.keySet();
for(Object key:keys){
System.out.println(key+”:”+db.getProperty(key.toString));
}
<!-- 定义list<String>对象 -->
<util:list id="somelist">
<value>qwe</value>
<value>asd</value>
</util:list>
然后可以将这个创建的list注入给bean
注意 用的是ref
property也可以从外部读取,建一个property文件来读取。
创建 db.property
写入:
user=root
password=root
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
在配置中写:
<util:property id=”dbParams” location=”classpath:db.property”>
</util:property >
//classpath也就是说从src找
location指向读取这个文件。
而且也可以在bean中读取。在 value=”#{dbParams.user}”
#{id.key}
这个dbParams就是上面的id。
这么写就是表达式注入
发现自己的se方面的有些忘了。要复习了!
class=”bean.xxx”
这个class指明的是bean的名称。带上包名
后面的<property>
是set注入,其属性的name对应的是bean的属性名,value对应的是给这个name属性注入属性值
传入list时时在property标签下写<list>
标签。list标签下写value标签,value标签里面是这个list的每一个元素。
d.Spring表达式注入(把当前对象的属性提取出来在注入到别的对象中)
#{表达式}
#{id名.属性}或者#{id名.key}
如果是对象属性,需要有get方法。因为属性定义的是私有的。用公有的get去获取。
那个表达式就和jsp中的一样。${表达式}和#{表达式}里面的表达式是一样的。
也就是说表达式注入可以把当前的对象的属性的值注入到别的对象中的属性中去。
3.利用注解配置应用IOC
在JDK5.0时追加一些新特性
List比如这个泛型。还有新式for循环
注解:在类定义,方法定义,成员变量定义前面使用。
格式为 @注解标记名
a.组件自动扫描
可以按指定的包路径,将包下所有组件扫描,如果发现组件类定义前有以下标记,会将组件扫描到Spring容器就是帮你写<bean>
@Component //其他组件
@Controller// 控制层组件 一般使用MVC框架时用到
@Service // 业务层组件
@Repository // 数据访问层组件Dao
@Named(需要引入第三方标准包)
先写一个bean类。比如里面就写个输出。
package Bean;
import org.springframework.stereotype.Component;
@Component //扫描ExampleBean组件。默认id=exampleBean
public class ExampleBean {
public void execute(){
System.out.println("执行execute处理方法!");
}
}
然后在配置文件中写:
<!-- 开启组件扫描 -->
<context:component-scan base-package="Bean"></context:component-scan>
测试类;
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import Bean.ExampleBean;
public class test {
public static void main(String[] args) {
String conf ="applicationContext.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(conf);
ExampleBean eb = ac.getBean("exampleBean",ExampleBean.class);
eb.execute();
}
}
getBean()方法调用成功。
不管在写多少个Bean类,只有把路径写入配置文件就可以了。一个包路径下可以写很多个。
如果想自己指定这个id名那么
@Component(“example1”)
在把测试类中的getBean改了就可以同样使用了。
自己写<bean>
的话有很多属性 id class init-method scope等
注解当然那么创建的也可以就是比如:使用 scope属性
@Scope(“prototype”)
就再添加一个@Scope就可以了,属性值就再括号里写。
初始化和销毁的话就再其方法前写:
@PostConstruct//等价于<bean init-method="">
public void init(){
System.out.println("初始化!");
}
@PreDestroy//等价于<bean destory-method="">
public void destroy(){
System.out.println("销毁!");
}
常用的就是把它扫描进去,然后控制其属性是否是单例
@Scope控制对象创建
@PostConstruct指定init-method
@PreDestroy指定destroy-method
b.注入注解
@Resource可以写在set方法前和属性前 将其注入
也可以用@Autowired用法一样。作用相同。
如果用注解的方法加上@Resource连set方法都可以不用写。
@Resource//默认按名称,如果按名称找不到对应名称的则按类型。
@Autowired是按类型
一般使用时,功能等价,都可以实现注入。
如果不存在多个匹配类型,都可以使用。
如果存在多个匹配类型就可以用指定名字的方式
@Autowired
加个@Qualifier(“强制指定的名字”)
也可以
@Resource(name=”指定名字”)//也就是说那这个指定的名字匹配
配置还是:
<!-- 开启组件扫描 -->
<context:component-scan base-package="Bean"></context:component-scan>
Computer.java
package Bean;
import org.springframework.stereotype.Component;
@Component
public class Computer {
private String cpu;
public void show(){
System.out.println("显示计算机信息");
}
}
Phone.java
package Bean;
import org.springframework.stereotype.Component;
@Component
public class Phone {
private String cpu;
public void show(){
System.out.println("显示手机信息");
}
}
Student.java
package Bean;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
@Component
public class Student {
//需要调用Computer和Phone对象
@Resource
private Computer c;//注入Computer对象
@Resource
private Phone p;//注入Phone对象
public void setC(Computer c) {
this.c = c;
}
public void setP(Phone p) {
this.p = p;
}
public void show(){
System.out.println("显示学生信息:");
c.show();
p.show();
}
}
Computer c = ac.getBean("computer",Computer.class);
c.show();
Phone p = ac.getBean("phone",Phone.class);
p.show();
Student s = ac.getBean("student",Student.class);
s.show();