setter注入,这里面protery的nam对象就是你那个类属性的名字,而ref就是你要set方法传参的值。 ref可以换成value就是基本数据类型和String。
setter注入
/ * UserServiceIml代码 */ 太多没有,就展示部分重要的
public class UserServiceImpl implements UserService {
private UserDao userDao;
private BookDao bookDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
}
/ * AppapplacionContext */
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
<!--注入引用类型-->
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
<!--property标签:设置注入属性-->
<!--name属性:设置注入的属性名,实际是set方法对应的名称-->
<!--ref属性:设置注入引用类型bean的id或name-->
<property name="userDao" ref="userDao"/>
<property name="bookDao" ref="bookDao"/>
</bean>
<!-- ref就是你要引用的id吗,他负责帮你创建class -->
构造器注入
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
<!--根据构造方法参数位置注入-->
<!-- 构造器注入除了name属性还有,type和index -->
<constructor-arg index="0" value="mysql"/>
<constructor-arg index="1" value="100"/>
</bean>
构造器注入对比setter注入实际上相比,构造器name属性对应构造器的参数名,而seter对应的属性名,另外。
构造器注入强制依赖性,也就是说适合程序一开始创建,就不用改的场景。而seter无所谓,只要属性名不改即可。中间seeter代码改不改无所谓。
自动装配注入
支持引用数据类型的自动装配,建议按照类型,去配置文件搜索有没有适合这个bean但是相应的seter方法要保留。
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
<!--autowire属性:开启自动装配,通常使用按类型装配,他会自动找,-->
<!-- 如果多个名字,就是按按名字注入,但是不推荐,byName是按照属性的的名字去找对应的id名字 -->
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byType"/>
集合注入
<!--数组注入-->
<property name="array">
<array>
<value>100</value>
<value>200</value>
<value>300</value>
<!-- <ref bean="bookDaoId"/>
// 引用类型几乎不会用
当参数-->
</array>
</property>
<!--list集合注入-->
<property name="list">
<list>
<value>itcast</value>
<value>itheima</value>
<value>boxuegu</value>
<value>chuanzhihui</value>
</list>
</property>
<!--set集合注入-->
<property name="set">
<set>
<value>itcast</value>
<value>itheima</value>
<value>boxuegu</value>
<value>boxuegu</value>
</set>
</property>
<!--map集合注入-->
<property name="map">
<map>
<entry key="country" value="china"/>
<entry key="province" value="henan"/>
<entry key="city" value="kaifeng"/>
</map>
</property>
<!--Properties注入-->
<property name="properties">
<props>
<prop key="country">china</prop>
<prop key="province">henan</prop>
<prop key="city">kaifeng</prop>
</props>
</property>
</bean>
案例:数据源对象管理
如要建一个druild的DruidDataSource对象,建一个数据库连接池,首先这个,
1.我们是不是要提供url,name等基本数据才能连上..
2. 这个DruidDataSource,并不是我们自己写的,所以用setter或者构造方法注入传入url等信息,是不是要看他怎么写的?
3.进入里面+双击 shirt 能搜索里面所有的方法,ctrl + H : 能看当前类的继承以及实现关系
等一下,这个数据库连接到后面用Mybatis注解开发,但是但是有利于理解前面的知识点。所看一下,了解原理即可。
开启context明明空间,将jdbc的配置文件单独隔离出来,
jdbc.properties 的配置文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/spring_db
jdbc.username=root
jdbc.password=root
容器
总结:
bean注解开发
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
//------ applicationContext.xml
<context:component-scan base-package="com.itheima"/>
这2相同
//声明当前类为Spring配置类
@Configuration
//设置bean扫描路径,多个路径书写为字符串数组格式
@ComponentScan({"com.itheima.service", "com.itheima.dao"})
public class SpringConfig {
}
AppForAnnotation.java
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
//ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//BookDao bookDao = (BookDao) ctx.getBean("bookDao");
//System.out.println(bookDao);
//按类型获取bean
BookService bookService = ctx.getBean("BookService");
System.out.println(bookService);
BookServiceImpl.java
//@Component定义bean
//@Component
//@Service:@Component衍生注解
@Service("bookService")
// 卧槽,有的话。有id等同与那个就是默认创建这个
public class BookServiceImpl implements BookService {
private BookDao bookDao;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
}
//@Component定义bean
//@Component("bookDao")
//@Repository:@Component衍生注解
@Repository("bookDao")
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ...");
}
}
// SpringConfig.java
//声明当前类为Spring配置类
@Configuration
//设置bean扫描路径,多个路径书写为字符串数组格式
@ComponentScan({"com.itheima.service", "com.itheima.dao"})
public class SpringConfig {
}
我们希望Spring给我们提供2个bean对象,并且第一个servicebean,要通过set注入或者构造方法注入,来获取daobean
采用组件化扫描,扫描com.iteheimna包,看到component(衍生注解),你可以指定一个id,给我们new 相应的对象, class="com.itheima.dao.impl.BookDaoImpl"
把这个省略,就这样把bean配置取代,把整个配置文件取代,通过检测我们set注入方法,检测我们需要啥,再配置注解,给我new bean