@ngdoc overview @name Dependency Injection @sortOrder 250 @description # Dependency Injection Dependency Injection (DI) is a software design pattern that deals with how components get hold of their dependencies. The Angular injector subsystem is in charge of creating components, resolving their dependencies, and providing them to other components as requested. ## Using Dependency Injection DI is pervasive throughout Angular. You can use it when defining components or when providing `run` and `config` blocks for a module. - Components such as services, directives, filters, and animations are defined by an injectable factory method or constructor function. These components can be injected with "service" and "value" components as dependencies. - Controllers are defined by a constructor function, which can be injected with any of the "service" and "value" components as dependencies, but they can also be provided with special dependencies. See {@link di#controllers Controllers} below for a list of these special dependencies. - The `run` method accepts a function, which can be injected with "service", "value" and "constant" components as dependencies. Note that you cannot inject "providers" into `run` blocks. - The `config` method accepts a function, which can be injected with "provider" and "constant" components as dependencies. Note that you cannot inject "service" or "value" components into configuration. See {@link module#module-loading-dependencies Modules} for more details about `run` and `config` blocks. ### Factory Methods The way you define a directive, service, or filter is with a factory function. The factory methods are registered with modules. The recommended way of declaring factories is: ```js angular.module('myModule', []) .factory('serviceId', ['depService', function(depService) { // ... }]) .directive('directiveName', ['depService', function(depService) { // ... }]) .filter('filterName', ['depService', function(depService) { // ... }]); ``` ### Module Methods We can specify functions to run at configuration and run time for a module by calling the `config` and `run` methods. These functions are injectable with dependencies just like the factory functions above. ```js angular.module('myModule', []) .config(['depProvider', function(depProvider) { // ... }]) .run(['depService', function(depService) { // ... }]); ``` ### Controllers Controllers are "classes" or "constructor functions" that are responsible for providing the application behavior that supports the declarative markup in the template. The recommended way of declaring Controllers is using the array notation: ```js someModule.controller('MyController', ['$scope', 'dep1', 'dep2', function($scope, dep1, dep2) { ... $scope.aMethod = function() { ... } ... }]); ``` Unlike services, there can be many instances of the same type of controller in an application. Moreover, additional dependencies are made available to Controllers: * {@link scope `$scope`}: Controllers are associated with an element in the DOM and so are provided with access to the {@link scope scope}. Other components (like services) only have access to the {@link $rootScope `$rootScope`} service. * {@link ngRoute.$routeProvider#when resolves}: If a controller is instantiated as part of a route, then any values that are resolved as part of the route are made available for injection into the controller. ## Dependency Annotation Angular invokes certain functions (like service factories and controllers) via the injector. You need to annotate these functions so that the injector knows what services to inject into the function. There are three ways of annotating your code with service name information: - Using the inline array annotation (preferred) - Using the `$inject` property annotation - Implicitly from the function parameter names (has caveats) ### Inline Array Annotation This is the preferred way to annotate application components. This is how the examples in the documentation are written. For example: ```js someModule.controller('MyController', ['$scope', 'greeter', function($scope, greeter) { // ... }]); ``` Here we pass an array whose elements consist of a list of strings (the names of the dependencies) followed by the function itself. When using this type of annotation, take care to keep the annotation array in sync with the parameters in the function declaration. ### `$inject` Property Annotation To allow the minifiers to rename the function parameters and still be able to inject the right services, the function needs to be annotated with the `$inject` property. The `$inject` property is an array of service names to inject. ```js var MyController = function($scope, greeter) { // ... } MyController.$inject = ['$scope', 'greeter']; someModule.controller('MyController', MyController); ``` In this scenario the ordering of the values in the `$inject` array must match the ordering of the parameters in `MyController`. Just like with the array annotation, you'll need to take care to keep the `$inject` in sync with the parameters in the function declaration. ### Implicit Annotation
To manage the responsibility of dependency creation, each Angular application has an {@link
angular.injector injector}. The injector is a
[service locator](http://en.wikipedia.org/wiki/Service_locator_pattern) that is responsible for
construction and lookup of dependencies.
Here is an example of using the injector service:
```js
// Provide the wiring information in a module
var myModule = angular.module('myModule', []);
```
Teach the injector how to build a `greeter` service. Notice that `greeter` is dependent on the
`$window` service. The `greeter` service is an object that contains a `greet` method.
```js
myModule.factory('greeter', function($window) {
return {
greet: function(text) {
$window.alert(text);
}
};
});
```
Create a new injector that can provide components defined in our `myModule` module and request our
`greeter` service from the injector. (This is usually done automatically by angular bootstrap).
```js
var injector = angular.injector(['ng', 'myModule']);
var greeter = injector.get('greeter');
```
Asking for dependencies solves the issue of hard coding, but it also means that the injector needs
to be passed throughout the application. Passing the injector breaks the
[Law of Demeter](http://en.wikipedia.org/wiki/Law_of_Demeter). To remedy this, we use a declarative
notation in our HTML templates, to hand the responsibility of creating components over to the
injector, as in this example:
```html